2011-09-01 71 views
3

我有兩個組件(AWriter和BWriter),其中都實現了IWriter接口。我有兩個組件(AComponent和BComponent),它們都實現了接口IComponent,並且都依賴於IWriter。但是在AC組件中,我想告訴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(); 
     } 
    } 

注:這只是簡單的問題,並把AWriter在在aComponent和BWriter在BComponent的依賴是不是一種選擇。在這個例子中,AComponent和BComponent也可能看起來相同,但這不是真實的情況。在實際情況中,我有更多的依賴和組件,我不想爲此而煩惱。

那麼,有沒有辦法以某種方式指定哪些實現應該Castle給我?

+1

[Caste Windsor問題]的可能重複(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的,但是如果你需要注入特定的實例,你可以命名它們並使用服務覆蓋來將每個實現注入到它的依賴結構中的適當位置。

相關問題