Castle ResolveAll返回空数组

时间:2012-02-01 23:36:50

标签: c# .net castle-windsor

以下是我的程序集(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的数组。相反,我得到一个空数组。怎么了?

2 个答案:

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

但这增加了容器的大小。我不确定它会如何影响性能。我想出来后,我会发布我的发现。我对此表示感谢。感谢。