2011-09-01 6 views
3

둘 다 IWriter 인터페이스를 구현하는 두 개의 구성 요소 (AWriter 및 BWriter)가 있습니다. 그리고 두 가지 구성 요소 (AComponent 및 BComponent) 모두 IComponent 인터페이스를 구현하고 둘 다 IWriter에 종속성이 있습니다. 하지만 AComponent에서 Windsor에게 AWriter의 인스턴스를 제공하고 BComponent에서 Windsor에게 BWriter의 인스턴스를 제공하라고 말하고 싶습니다. 그렇게하는 방법?Windsor Castle의 구성 요소 종속성에 표기법 추가

public interface IWriter 
    { 
     void Write(); 
    } 

    public class AWriter : IWriter 
    { 
     public void Write() 
     { 
      Console.Write("A writer"); 
     } 
    } 

    public class BWriter : IWriter 
    { 
     public void Write() 
     { 
      Console.Write("B writer"); 
     } 
    } 

    public interface IComponent 
    { 
     void Do(); 
    } 

    public class AComponent : IComponent 
    { 
     IWriter writer; 

     public AComponent(IWriter writer) 
     { 
      this.writer = writer; 
     } 

     public void Do() 
     { 
      writer.Write(); 
     } 
    } 

    public class BComponent : IComponent 
    { 
     IWriter writer; 

     public BComponent(IWriter writer) 
     { 
      this.writer = writer; 
     } 

     public void Do() 
     { 
      writer.Write(); 
     } 
    } 

참고 : 여기에

코드입니다이 그냥 단순화 문제 및 종속성으로 BComponent에 aComponent의 및 BWriter에 AWriter을 두는 것은 옵션이 아닙니다. 또한이 예에서는 AComponent와 BComponent가 같을 수도 있지만 실제 상황은 아닙니다. 나는 실제 상황에서 훨씬 더 많은 의존성과 구성 요소를 가지고 있으며, 나는 그것에 귀찮게하고 싶지 않았다.

그래서성에 어떻게 구현해야하는지 몇 가지 속성으로 지정하는 방법이 있습니까?

+1

[Caste Windsor problem] 가능한 복제본 (http://stackoverflow.com/questions/7158858/caste-windsor-problem) –

답변

1

명명 된 구성 요소 및 서비스 재정의를 사용하려고합니다. 도움을 윈저의 문서에 여기를 참조하십시오 : http://docs.castleproject.org/Windsor.Registering-components-one-by-one.ashx

당신은 같은 것을 할 거라고 유창 등록을 사용하여 :

container.Register(Component.For<IComponent>() 
          .ImplementedBy<AWriter>().Named("AWriter"), 
        Component.For<IComponent>() 
          .ImplementedBy<BWriter>().Named("BWriter")); 

:

container.Register(Component.For<IComponent>() 
          .ImplementedBy<AComponent>() 
          .ServiceOverrides(
           ServiceOverride.ForKey("writer").Eq("AWriter")); 
container.Register(Component.For<IComponent>() 
          .ImplementedBy<BComponent>() 
          .ServiceOverrides(
           ServiceOverride.ForKey("writer").Eq("BWriter")); 

이 IComponent에 대한이 개 등록 될 것입니다 물론을, 그러나 다시 특정 인스턴스를 삽입해야하는 경우 이름을 지정하고 서비스 대체를 사용하여 각 구현을 종속성 구조의 적절한 지점에 주입 할 수 있습니다.

관련 문제