2009-08-17 2 views
5

Castle Windsor Container에서는 하나의 구성 요소가 두 개의 다른 인터페이스를 구현하고 동일한 구성 요소 인스턴스를 반환 할 때이를 해결할 수 있습니까? 예를 들어; 라는 메시지 와 함께 예외가 같이 내가 이것을하려고하면castsor 윈저 컨테이너가 2 개의 인터페이스를 구현하는 구성 요소의 동일한 인스턴스를 반환 할 수 있습니까?

var windsor = new WindsorContainer() 
    .AddComponent<InterfaceA, ClassAB>() 
    .AddComponent<InterfaceB, ClassAB>(); 

var classAB1 = windsor.Resolve<InterfaceA>(); 
var classAB2 = windsor.Resolve<InterfaceB>(); 

Assert.AreSame(classAB1, classAB2); 

는 다음 클래스 ClassAB의 두 개의 인스턴스를 반환 내가 다른 키를 제공하는 경우 이미 지정된 키에 등록 된 구성 요소가 있습니다.

편집 : 이상적으로 설정 파일에서 수행하고 싶습니다.

var someInstance = new Instance(); 
var container = new WindsorContainer(); 

container.Register(Component.For(typeof(IFirstInterface)).Instance(someInstance)); 
container.Register(Component.For(typeof(ISecondInterface)).Instance(someInstance)); 

을 ...하지만 당신은 Instance 클래스를 인스턴스화 할 수있는 컨테이너의 능력을 상실하므로 종속성은 자동적으로 해결되지 않습니다 : 그것은과 같이 수행 할 수 있습니다 -

+0

Windsor FAQ에 질문이 추가되었습니다. http://using.castleproject.org/display/IoC/FAQ –

답변

11
[TestFixture] 
public class Forwarding { 
    public interface InterfaceA {} 

    public interface InterfaceB {} 

    public class ClassAB: InterfaceA, InterfaceB {} 

    [Test] 
    public void tt() { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<InterfaceA, InterfaceB>().ImplementedBy<ClassAB>()); 
     var a = container.Resolve<InterfaceA>(); 
     var b = container.Resolve<InterfaceB>(); 
     Assert.AreSame(a, b); 
    } 
} 
+0

B의 아들 ... 정말요? 너 할 수있어? 주님께서는 제가 생각해 낸 해결 방법을 알고 있습니다. –

+0

답장을 보내 주셔서 감사합니다.하지만이 기능은 훌륭하게 보이지만 목표 파일을 옮기는 것만으로도 설정 파일에서 수행 할 수 있는지 알 수 있습니까? – Gareth

+0

예, 가능합니다. http://stackoverflow.com/questions/274220 –

1

나는이 하나의 해결책을 알고있다. 물론 인스턴스에 종속성이없는 경우에는이 문제에 별 관심이 없습니다.

관련 문제