如何使用不同的依赖项两次注册同一个类
本文关键字:两次 注册 同一个 何使用 依赖 | 更新日期: 2023-09-27 18:16:34
我想将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
}
但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"))
);
或者,不是直接的答案,但您可以选择解决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>());