2013-06-02 41 views
0

我想將Castle Windsor配置爲創建兩個相同類型的組件(Foo - > IFoo),但具有不同的構造函數輸入。我以後也想在創建另一個組件時使用這兩個組件(類型Bar - 參見下面的代碼)。如何用不同的依賴關係註冊兩次相同的類

public interface IFoo { } 

public class Foo : IFoo 
{ 
    private string _prop; 

    public Foo(string prop) 
    { 
     _prop = prop;    
    } 
} 

public class Bar 
{ 
    private IFoo _fooAbc; 
    private IFoo _foo123; 

    public Bar(IFoo fooAbc, IFoo foo123) 
    { 
     _foo123 = foo123; 
     _fooAbc = fooAbc; 
    } 
} 

在組件安裝我試圖註冊的組件是這樣的:

public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromThisAssembly() 
          .BasedOn<IFoo>().WithServiceBase() 
          .ConfigureFor<Foo>(c => c.DependsOn(Dependency.OnValue<string>("abc")).Named("fooAbc")) 
          .ConfigureFor<Foo>(c => c.DependsOn(Dependency.OnValue<string>("123")).Named("foo123"))); 

     container.Register(Component.For<Bar>()); //?? specify which service to use 
    } 

但是城堡引發註冊異常。那麼我怎樣才能配置Foo的兩個實例,一個是「abc」,另一個是「123」依賴?另外,我稍後想要在構建Bar時正確地分配它們,以便將fooAbc用作第一個構造函數輸入,並將foo123用作第二個。我的最終目標是成功解決Bar問題。

+0

它怎麼知道如何解決這兩者之間的問題?我不明白你問的是什麼可能。你解決IFoo或Foo和酒吧? –

+0

通過註冊名稱也許?最後,我想要解決Bar和所需的IFoo實例。我對我的模糊性表示歉意,但我對城堡和IoC容器的使用情況都很陌生。 – Rok

回答

1

我不知道這是否是更接近你問什麼,但是,你可以使用 ServiceOverride.ForKey指定哪些參數映射到該名稱:

Component.For<Bar>().ImplementedBy<Bar>(). 
    DependsOn(ServiceOverride.ForKey("fooAbc").Eq("abc")). 
    DependsOn(ServiceOverride.ForKey("foo123").Eq("123")) 
); 

另外,不直接回答,但您擁有的選項是解決IEnumerable<IFoo>。如果您確實有任意數量的IFoo需要解決,這是一個不錯的選擇。

如果更改欄的定義來接受IEnumerable

public class Bar 
{ 
    private readonly IEnumerable<IFoo> _foos; 

    public Bar(IEnumerable<IFoo> foos) 
    { 
     _foos = foos; 
    } 
} 

然後爲註冊和解析。在進行註冊之前,您需要添加Resolve。

var container = new WindsorContainer(); 

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, true)); 

container.Register(
    Component.For<IFoo>().Instance(new Foo("abc")).Named("abc"), 
    Component.For<IFoo>().Instance(new Foo("123")).Named("123"), 
    Component.For<Bar>().ImplementedBy<Bar>()); 
+0

對於我所需要的,這是可行的,但如果我想用不同的生活方式註冊呢?有關於此的任何想法?儘管謝謝你的回答! – Rok

+0

然而,您可以註冊它們 - 這是您設置重要傾向的方式 –

相關問題