Castle ResolveAll返回空数组
本文关键字:数组 返回 ResolveAll Castle | 更新日期: 2023-09-27 18:22:23
以下是我的程序集(TestAssembly)的外观
Class BaseClass
{
....
....
}
Interface I1
{
....
....
}
Interface I2 : I1
{
....
....
}
Interface I3 : I1
{
....
....
}
Class A : BaseClass, I2
{
....
....
}
Class B : BaseClass, I3
{
....
....
}
我正在使用温莎城堡来注册和解决所有这些组件。
container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
.BasedOn<I1>()
.LifestyleSingleton());
接下来,我正在尝试使用解析所有类型的I1(接口I1)
container.ResolveAll<I1>();
希望得到一个对象A和B的数组。相反,我得到了一个空数组。怎么了?
我认为您需要告诉容器哪些服务与接口关联,比如:
container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
.BasedOn<I1>()
.WithServiceBase()
.LifestyleSingleton());
我似乎已经找到了问题的答案(请参阅我对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>();
但是这增加了容器的大小。我不确定它对性能有何影响。我会把我的发现公布出来。我感谢你对此发表评论。谢谢