2011-01-07 2 views
5

FirstBar 및 SecondBar에서 구현 한 Foo 및 IBar에서 IFoo를 구현했다고 가정합니다. 우리는 컨테이너에 세 가지 항목이 있습니다Castle Windsor : 특정 구현과 함께 대회 등록 사용

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface()) 

:

이 대회 등록하여 지금

IFoo = Foo 
IBar = FirstBar 
IBar = SecondBar 

을, 우리는 어떻게 용기를 말할 수있을이 등록을 조정할 수에 대한 우리는 SecondBar 등록만을 원하십니까? 일종의 :

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface() 
     .For<IBar>().Select<SecondBar>()) 

사용 사례 : 우리는 모든 규칙에 따라 등록 된 응용 프로그램에 많은 서비스를 제공합니다. 그러나, 일부 서비스 인터페이스는 2 개 이상의 구현 예 (예 : 실제 구현, 가짜 구현 및 테스트 구현)를 갖는다. 국제 대회 등록은 모두 같은 인터페이스 아래 등록되며, 인터페이스를 해결하는 동안 (비 결정적 순서로) 첫 번째 구현을 얻습니다. 우리는 등록하는 동안 해당 서비스에 대한 하나의 특정 구현을 선택할 수 있기를 원합니다. 어떻게 할 수 있니?

답변

3

이 수행 된 작업 만들어진 것입니다 :

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface()) 
     .ConfigureFor<IBar>(c => 
      c.If((k, m) => m.Implementation == typeof(SecondBar))); 

이 효과적으로 IBar 서비스 만 SecondBar의 IMPL를 등록합니다. 이렇게하면 주어진 서비스에 대해 하나 이상의 구현이있는 경우 기존 스캐너에 원하는 impl이 있는지 말할 수 있습니다.

우리가 나서서 이러한 목적을 위해 좋은 작은 확장 메서드 생성 :

public static BasedOnDescriptor Select<TService, TImpl>(this BasedOnDescriptor desc) 
{ 
    return desc.ConfigureFor<TService>(c => c.If((k, m) => m.Implementation == typeof(TImpl))); 
} 

public static BasedOnDescriptor Ignore<TService>(this BasedOnDescriptor desc) 
{ 
    return desc.ConfigureFor<TService>(c => c.If((k, m) => false)); 
} 

우리는 지금과 같이 사용할 수 있습니다 : 모든이의

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface()) 
     .Select<IBar, SecondBar>() 
     .Ignore<ISomeService>() 

모두 잘 작동합니다. 그 두 가지 방법이 캐슬에있을 수 있다고 믿습니다. 적절한 인도어. @ Krzysztof Koźmic : 패치는 어디에 제출해야합니까? :)

+0

Github. 첫 번째 의견을 수집하기 위해 Google 그룹의 성 사용자 그룹에 먼저 표시하는 것이 좋습니다. 건배 –

+0

예, 무시가 필요한 것입니다. – PandaWood

5

대회 규칙을 조하십시오. 그것은 분명히 넓다.

container.Register(
    AllTypes.FromThisAssembly() 
     .Where(t => t.Namespace != "Acme.Tests") 
     .WithService.DefaultInterface()) 
관련 문제