Castle Windsor解析通用接口阵列

时间:2014-06-27 13:42:47

标签: c# generics castle-windsor

我有一个具有相同通用接口的一定量实现的程序集。 我使用以下在温莎的注册一次性注册所有这些:

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

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

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

为什么?

2 个答案:

答案 0 :(得分:0)

@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以调用所有查询的常用实现。

答案 1 :(得分:0)

它不起作用,因为您的服务被注册为具体的实现类型。将WithService.FromInterface()子句添加到注册码中,将其注册为接口抽象。 IMO它也不起作用(使用开放的泛型解析)。

相关问题