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的数组。相反,我得到了一个空数组。怎么了?

Castle ResolveAll返回空数组

我认为您需要告诉容器哪些服务与接口关联,比如:

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

但是这增加了容器的大小。我不确定它对性能有何影响。我会把我的发现公布出来。我感谢你对此发表评论。谢谢