簡體   English   中英

如何用不同的依賴項兩次注冊同一個類

[英]How to register same class twice with different dependencies

我想配置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。

我不確定這是否更接近您的要求,但是,您可以使用ServiceOverride.ForKey指定哪些參數映射到哪些名稱:

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

另外,不是直接答案,而是解決IEnumerable<IFoo>一個選擇。 如果您實際上有任意數量的IFoo可以解決,那么這是一個不錯的選擇。

如果您更改Bar的定義以接受IEnumerable

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

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

然后注冊並解決。 您需要在注冊之前添加解析。

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>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM