Generics 向Autofac注册部分开放泛型

Generics 向Autofac注册部分开放泛型,generics,autofac,Generics,Autofac,我有下面的情况,实现我的接口的类接受多个泛型,但在接口的实现中只使用其中一个(另一个是关闭的) 公共接口测试 { } 公共类考试:ITest { } 我已尝试将此注册为 builder.RegisterGeneric(typeof (Test<,>)).AsImplementedInterfaces(); builder.RegisterGeneric(typeof(Test)).asiimplementedinterfaces(); 及

我有下面的情况,实现我的接口的类接受多个泛型,但在接口的实现中只使用其中一个(另一个是关闭的)

公共接口测试
{                   
}
公共类考试:ITest
{
}
我已尝试将此注册为

builder.RegisterGeneric(typeof (Test<,>)).AsImplementedInterfaces();
builder.RegisterGeneric(typeof(Test)).asiimplementedinterfaces();

builder.RegisterGeneric(typeof(Test)).As(typeof(ITest));
但当我试图解决

container.Resolve<ITest<Guid, string>>();
container.Resolve();
我明白了

请求的服务“ITest”2[[System.Guid,mscorlib, 版本=4.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089],[System.String,mscorlib, 版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089]' 尚未注册。要避免此异常,请注册 组件来提供服务,请使用 IsRegistered(),或使用ResolveOptional()方法解析 可选依赖项

我猜它假设泛型在实现和接口中是相同类型的?有什么建议吗


谢谢问题是由
测试中的通用参数
TU
引起的。请理解,此
TU
ITest
中定义的
TU
参数无关,但这是一个完全不同的参数。为了使这一点更加明显,您应该重命名该参数,例如:

公共类测试:ITest
{
}
由于此泛型参数不同,并且未映射到
ITest
抽象中的泛型参数,因此Autofac无法从请求的
ITest
封闭版本推断
X
。问问自己:如果我请求一个
ITest
,那么
X应该是什么。这将解析为
Test
,但
X
仍然未知

由于Autofac无法推断
X
,因此它将永远无法使用
测试
,请求将失败

由于
Test
永远无法解析,不幸的是,Autofac在调用
RegisterGeneric
时没有抛出异常,因为它应该能够发现
Test
永远无法解析

所以真正的问题是,当
ITest
得到解决时,您希望
X
成为什么?Autofac不允许部分泛型类型定义,但C#编译器也不允许,因此这通常不是问题。“填充”该
X
参数的最简单方法是从
Test
派生:

//组成根目录的一部分
内部类浮动测试:测试
{
}
注册此类时不会出现问题:

builder.RegisterGeneric(typeof(FloatTest))
.As(类型(ITest))

它是开源的,因此您可以查看通用解析代码:您的
测试是否需要第二个通用参数?因为如果您有这样的
公共类Test:ITest
那么注册
builder.RegisterGeneric(typeof(Test)).asiimplementedinterfaces()工作正常。不幸的是,我确实需要两个通用参数,这两个参数在后退一步并查看问题时都是有意义的。谢谢
builder.RegisterGeneric(typeof (Test<,>)).As(typeof (ITest<,>));
container.Resolve<ITest<Guid, string>>();