2

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

public interface ITest<T, TU>
{                   
}

public class Test<T, TU> : ITest<Guid, T>
{
}

我已经尝试将其注册为

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

builder.RegisterGeneric(typeof (Test<,>)).As(typeof (ITest<,>));

但是当我尝试解决为

container.Resolve<ITest<Guid, string>>();

我明白了

请求的服务 'ITest`2[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ]]' 尚未注册。要避免此异常,请注册一个组件以提供服务,使用 IsRegistered() 检查服务注册,或使用 ResolveOptional() 方法解决可选依赖项。

我猜它假设泛型在实现和接口中属于同一类型?有什么建议么?

谢谢

4

1 回答 1

3

TU问题是由Test<T, TU>. 请理解,这与中定义TU的参数无关,但这是一个完全不同的参数。为了使这一点更明显,您应该重命名该参数,例如:TUITest<TU, T>

public class Test<T, X> : ITest<Guid, T>
{
}

因为这个泛型参数是不同的并且不映射到ITest<TU, T>抽象中的泛型参数,所以 Autofac 无法X从请求的ITest<TU, T>. 问问自己:X如果我请求ITest<Guid, string>. 这将解决,Test<string, X>但这X仍然是未知的。

因为 Autofac 无法推断X,所以它永远无法使用Test<T, X>并且请求将失败。

由于Test<T, X>永远无法解决,不幸的是 Autofac 在调用期间没有抛出异常RegisterGeneric,因为它应该能够找出Test<T, X>永远不会解决的问题。

X所以真正的问题是,当ITest<Guid, T>得到解决时,你想成为什么?Autofac 不允许部分泛型类型定义,但 C# 编译器也不允许,所以这通常不是问题。“填写”该X论点的最简单方法是从Test<T, X>

// Part of your Composition Root
internal class FloatTest<T> : Test<T, float>
{
}

这个类可以毫无问题地注册:

builder.RegisterGeneric(typeof(FloatTest<>))
    .As(typeof(ITest<,>))
于 2013-07-03T19:32:07.330 回答