这个问题是我之前问题的后续:Autofac:将多个逆变实现隐藏在一个组合后面 https://stackoverflow.com/questions/7139054/autofac-hiding-multiple-contravariant-implementations-behind-one-composite.
我试图找到 Autofac 协变和逆变支持的边界。我注意到 Autofac 的ContravariantRegistrationSource
仅支持具有单个泛型参数的泛型接口,该参数标记为in
关键词。这似乎限制了这个功能的用处,我想知道 Autofac 是否有其他方法来扩展协变和逆变的支持。
我必须承认,我问这个问题并不是因为我正在从事真正的应用程序设计。为了教育目的,我故意试图找到 Autofac 的局限性。
因此考虑以下接口:
public interface IConverter<in TIn, out TOut>
{
TOut Convert(TIn value);
}
以及以下实现:
public class ObjectToStringConverter : IConverter<object, string>
{
string IConverter<object, string>.Convert(object value)
{
return value.ToString();
}
}
以及以下注册:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterType<ObjectToStringConverter>()
.As<IConverter<object, string>>();
var container = builder.Build();
通过这种设计和配置,我希望能够做到这一点:
// This call succeeds because IConverter<object, string> is
// explicitly registered.
container.Resolve<IConverter<object, string>>();
// This call fails, although IConverter<string, object> is
// assignable from IConverter<object, string>.
container.Resolve<IConverter<string, object>>();
或者让我用给定的定义更抽象地说:
public class A { }
public class B : A { }
public class C : B { }
public class AToCConverter : IConverter<A, C> { ... }
以及以下注册:
builder.RegisterType<AToCConverter>()
.As<IConverter<C, A>>();
我希望以下调用能够成功:
container.Resolve<IConverter<C, A>>();
container.Resolve<IConverter<B, B>>();
container.Resolve<IConverter<A, C>>();
我们如何使用 Autofac 来做到这一点?