我有一个具有相同通用接口的一定量实现的程序集。 我使用以下在温莎的注册一次性注册所有这些:
Types
.FromAssembly(Assembly.GetExecutingAssembly())
.BasedOn(typeof(IQuery<,>))
现在我想获得所有注册实现的数组,但是如果我尝试这个城堡炸弹:
container.ResolveAll(typeof (IQuery<,>))
为什么?
答案 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它也不起作用(使用开放的泛型解析)。