2011-09-01 31 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的,但是如果你需要注入特定的实例,你可以命名它们并使用服务覆盖来将每个实现注入到它的依赖结构中的适当位置。

相关问题