C# 如何使用不同的依赖项注册同一类两次

C# 如何使用不同的依赖项注册同一类两次,c#,castle-windsor,ioc-container,C#,Castle Windsor,Ioc Container,我想将Castle Windsor配置为创建两个相同类型的组件(Foo->IFoo),但使用不同的构造函数输入。稍后我还想在创建另一个组件时使用这两个组件(键入Bar-请参见下面的代码) 在component installer中,我尝试注册如下组件: public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register(Classes.FromTh

我想将Castle Windsor配置为创建两个相同类型的组件(Foo->IFoo),但使用不同的构造函数输入。稍后我还想在创建另一个组件时使用这两个组件(键入Bar-请参见下面的代码)

在component installer中,我尝试注册如下组件:

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
    }
public void安装(IWindsorContainer,IConfigurationStore)
{
container.Register(Classes.fromthissembly())
.BasedOn().WithServiceBase()
.ConfigureFor(c=>c.DependsOn(Dependency.OnValue(“abc”))。命名为(“fooAbc”))
.ConfigureFor(c=>c.DependsOn(Dependency.OnValue(“123”)).Named(“foo123”));
container.Register(Component.For());//?指定要使用的服务
}

但是castle抛出了一个注册例外。那么,如何配置两个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"))
);
然后注册并解决。在进行注册之前,您需要添加解析

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>());
var容器=新的WindsorContainer();
container.Kernel.Resolver.AddSubResolver(新的CollectionResolver(container.Kernel,true));
集装箱。登记(
Component.For().Instance(new Foo(“abc”))。命名为(“abc”),
Component.For().Instance(新的Foo(“123”))。命名为(“123”),
Component.For().ImplementedBy());

它如何知道如何解决这两个问题?我不明白你问的怎么可能。你是在解析IFoo还是Foo和Bar?也许是通过注册名?最后,我想用所需的IFoo实例解析Bar。我为我的含糊不清道歉,但我对castle和IoC容器的使用都是新手。对于我的要求,这是可行的,但是如果我想注册一个不同的生活方式呢?有什么想法吗?谢谢你的回答!你可以根据自己的意愿注册,这是你设置部门的重要方式
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>());