城堡ResolveAll返回空数组。

3
以下是我的汇编代码(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());

接下来我尝试使用

ResolveAll

解决所有类型的I1(接口I1)。

container.ResolveAll<I1>();

在希望获取对象数组A和B的情况下,我得到了一个空数组。出了什么问题?
2个回答

5

我认为您需要告诉容器将哪些服务与接口相关联,类似于:

container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
    .BasedOn<I1>()
    .WithServiceBase()
    .LifestyleSingleton());

这对我来说看起来也是个问题。 - Gary.S
谢谢,问题解决了。未来参考一下这里是Windsor API文档的链接:http://stw.castleproject.org/Windsor.Registering-components-by-conventions.ashx - user1178376
@Hans Jonus,我似乎找不到关于ResolveResolveAll的足够API文档。 container.ResolveAll<I1>()返回I1[]。我该如何检索AB的特定实例(在我的情况下是单例)? - user1178376
另外,container.Resolve<I2>(); 也无法给我提供 A 的实例。我该如何解决 I2 的实现? - user1178376
请确保你的类是公共的,就像文档中所说:“默认情况下,只有从程序集外部可见的类型会被注册。”如果您使用了内部类等,则很容易忽略。 - Jonas Stensved

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

但这会增加容器的大小。我不确定它对性能有什么影响。我会在弄清楚后发布我的发现。我感谢任何关于此事的评论。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接