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>>();