我有一个具有一定数量的相同通用接口实现的程序集。 我使用温莎以下登记注册所有的人都在一个镜头:Castle Windsor解析通用接口数组
Types
.FromAssembly(Assembly.GetExecutingAssembly())
.BasedOn(typeof(IQuery<,>))
现在我想获得所有注册的实现数组,但如果我试试这个城堡炸弹:
container.ResolveAll(typeof (IQuery<,>))
为什么?
我有一个具有一定数量的相同通用接口实现的程序集。 我使用温莎以下登记注册所有的人都在一个镜头:Castle Windsor解析通用接口数组
Types
.FromAssembly(Assembly.GetExecutingAssembly())
.BasedOn(typeof(IQuery<,>))
现在我想获得所有注册的实现数组,但如果我试试这个城堡炸弹:
container.ResolveAll(typeof (IQuery<,>))
为什么?
@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()
子句添加到您的注册码中,将其注册为接口抽象。国际海事组织也不会工作(与开放式泛型分辨率)。
什么是例外? –
那么期望是这个接口实现的数组,这实际上是一个,如果我在运行时检查容器调试。但是,如果我尝试使用通用接口城堡解决所有问题,请抛出一个异常,说它无法解析通用接口数组。 – Raffaeu
由于Windsor不知道为您创建什么,因此无法解析开放泛型类型。你将不得不指定一个封闭的泛型类型,比如'container.ResolveAll(typeof(IQuery))'。 –
Steven