2014-06-27 19 views
0

我有一个具有一定数量的相同通用接口实现的程序集。 我使用温莎以下登记注册所有的人都在一个镜头:Castle Windsor解析通用接口数组

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

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

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

为什么?

+0

什么是例外? –

+0

那么期望是这个接口实现的数组,这实际上是一个,如果我在运行时检查容器调试。但是,如果我尝试使用通用接口城堡解决所有问题,请抛出一个异常,说它无法解析通用接口数组。 – Raffaeu

+1

由于Windsor不知道为您创建什么,因此无法解析开放泛型类型。你将不得不指定一个封闭的泛型类型,比如'container.ResolveAll(typeof(IQuery ))'。 – Steven

回答

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呼吁所有的疑问共同实施。

0

它不起作用,因为你的服务被注册为具体类型的实现。将WithService.FromInterface()子句添加到您的注册码中,将其注册为接口抽象。国际海事组织也不会工作(与开放式泛型分辨率)。