以下是我的程序集(TestAssembly)的外观
Class BaseClass
{
....
....
}
Interface I1
{
....
....
}
Interface I2 : I1
{
....
....
}
Interface I3 : I1
{
....
....
}
Class A : BaseClass, I2
{
....
....
}
Class B : BaseClass, I3
{
....
....
}
我正在使用Castle Windsor来注册和解决所有这些组件。
container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
.BasedOn<I1>()
.LifestyleSingleton());
我想尝试使用
解析所有类型的I1(接口I1)container.ResolveAll<I1>();
希望获得一个对象A和B的数组。相反,我得到一个空数组。怎么了?
答案 0 :(得分:5)
我认为你需要告诉容器哪些服务与界面相关联,例如:
container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
.BasedOn<I1>()
.WithServiceBase()
.LifestyleSingleton());
答案 1 :(得分:1)
我似乎找到了我的问题的答案(请参阅我对Hans Jonus的回应的评论)。
在接口继承的情况下,有一个流畅的API,您可以在其中指定服务应该使用的接口。
使用问题中提到的示例:
container.Register(Classes.FromAssemblyNamed("TestAssembly")
.BasedOn<I1>()
.WithService.FirstInterface());
这使您可以使用
解析A类和B类的特定实例I2 ObjA = container.Resolve<I2>();
I3 ObjB = container.Resolve<I3>();
或者,如果您想要实现基接口(I1
)的所有实例,则必须以这种方式注册。
container.Register(Classes.FromAssemblyNamed("TestAssembly")
.BasedOn<I1>()
.WithService.AllInterfaces()
);
这样你可以做任何你想要的,我的意思。
I2 ObjA = container.Resolve<I2>();
I3 ObjB = container.Resolve<I3>();
I1[] ObjArray = container.ResolveAll<I1>();
但这增加了容器的大小。我不确定它会如何影响性能。我想出来后,我会发布我的发现。我对此表示感谢。感谢。