Castle Windsor解析泛型接口数组

本文关键字:泛型接口 数组 Windsor Castle | 更新日期: 2023-09-27 18:10:37

我有一个具有一定数量的相同泛型接口实现的程序集。我在温莎使用以下注册将它们全部注册在一个镜头中:

Types
   .FromAssembly(Assembly.GetExecutingAssembly())
   .BasedOn(typeof(IQuery<,>))

现在我想得到所有注册实现的数组,但如果我尝试这个城堡炸弹:

container.ResolveAll(typeof (IQuery<,>))

为什么?

Castle Windsor解析泛型接口数组

@Steven是对的,如果不知道它们嵌入什么类型,就不可能解析泛型类型。然而,有两种方法可以回避这个问题

您有一个可能的输入和输出类型的封闭列表,您可以在其上迭代以解析所有特定的组合

for var Type1 in PossibleTypes1
    for var Type2 in PossibleTypes2
        var list = container.ResolveAll(typeof(IQuery<,>).MakeGenericType(Type1, Type2)

这不是很优雅,但你可以得到你所有的查询。然而,我想提出第二种选择。

如果你想解决你所有的查询,你必须有一个你想调用的操作,或者一些你想要得到的信息。如果是这样,则此操作或信息应该存在于泛型接口继承的基本非泛型接口中。假设您想获得操作名称,您可以这样做:

public interface IBaseQuery {
    string getOperationName(); // your common operation 
}
public interface IQuery<In, Out>: IBaseQuery {
}

然后,您将注册您的IQuery实现对其所有接口,并解析IBaseQuery调用所有查询的公共实现。

这不起作用,因为您的服务被注册为具体类型的实现。将WithService.FromInterface()子句添加到您的注册代码中,将其注册为接口抽象。在我看来,它也不会工作(与开放泛型分辨率)。