2011-12-16 2 views
4

우리는 CollectionResolver (특히 ListResolver)를 사용하여 인터페이스의 여러 구현을 삽입하려는 시나리오를 지원합니다. CollectionResolver의 동작은 Castle 3의 ResolveAll()에 대한 변경으로 인해 영향을받습니다. 이전에는 ResolveAll()이 해결할 수있는 구현 만 반환하고 해결할 수없는 등록 된 구현은 무시합니다. 이제는 등록 된 구현 중 하나라도 해석 할 수없는 경우 ResolveAll()이 실패합니다.Castle 3에서 이전 CollectionResolver 동작으로 되돌리려면?

일반적으로 나는 이것이 우리가 실제로 생각하는 모든 구현을 얻고 있기 때문에 좋은 변화라고 생각합니다. 그러나 필자는 실제로 과거의 행동을 나의 이익에 사용하고있는 몇 가지 시나리오를 가지고 있습니다. 공용 설치 프로그램에 등록 된 인프라 구성 요소 (IBar)는 IFoo 컬렉션에 따라 결정됩니다 (컬렉션 확인자가 수행해야 함). 공용 설치 프로그램에서 IFoo의 일부 구현을 등록하지만 이러한 구현은 등록되지 않았거나 등록되지 않은 서비스에 따라 다릅니다. 아이디어는 클라이언트가 종속 서비스를 등록하여 IFoo 구현을 "활성화"할 수 있다는 것입니다. 이전에는 클라이언트가 특정 IFoo의 종속성을 등록하지 않은 경우 IFoo의 구현이 IBar에 주입되지 않았습니다 (그리고 다른 해결 가능한 구현이 될 것입니다). 이제 (이전에 선택 사항 인) IFoo를 해결할 수 없었기 때문에이 시나리오에서는 IBar의 해결이 실패합니다.

쉽게 이전 동작을 복원 할 수있는 방법이 있습니까? 기본적으로 새로운 동작을 사용하고 싶지만 특정 서비스 (이 경우에는 IFoo)의 이전 동작으로 되돌리려면 이상적입니다. 나는 이것을 달성하기 위해 IHandlersFilter 구현을 시도했지만 모든 후보 핸들러 (SelectHandlers에서 빈 배열을 반환)를 필터링 할 수 없다는 것을 발견했다. 시도하면 Windsor가 필터를 무시하고 어쨌든 모든 후보 핸들러를 해결하십시오.

아이디어가 있으십니까? 나는 또한 내 목표를 달성하기위한 완전히 다른 접근 방식에 열려 있습니다. 만약 당신이 내가 잘못된 방향으로 가고 있다고 생각한다면.

답변

1

IHandlersFilter이라는 새로운 확장 점을 사용하여 ResolveAll 동작을 미세하게 제어 할 수 있습니다. 예를 들어 this blogpost을 참조하십시오.

+0

안녕하세요 Krzysztof - 저는이 방법을 시도했지만 불행히도 SelectHandler에서 빈 배열을 반환하면 Windsor는 필터를 무시합니다 (이 코드는 DefaultNamingSubSystem.GetFiltersOpinion에 있음). 따라서 모든 필터를 필터링 할 수있는 방법이 없습니다. 등록 된 구현 또 다른 질문이 가치가있을 수 있지만 특정 핸들러를 해석 할 수 있는지를 결정하는 간단한 방법이 있습니다 (IHandlersFilter 구현 내부). –

+0

나는 또 다른 질문을 게시했다 : 위의 설명 : http://stackoverflow.com/questions/8567780/how-to-determine-if-a-component-is-resolvable-from-an-ihandlersfilter-implementa –

+0

나는 나중에 참조 용으로 승인 된 것으로 표시하지만 위의 내용에 유의하십시오.이 메커니즘을 통해 모든 IHandler를 제거 할 수는 없습니다. 따라서 이전 동작을 완전히 복원하는 것이 가능하지는 않습니다 (ResolveAll에 의존하는 메커니즘 사용). –

관련 문제