【发布时间】:2011-11-11 12:48:52
【问题描述】:
这个问题是我上一个问题的后续问题: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 做到这一点?
【问题讨论】:
标签: c# dependency-injection ioc-container autofac covariance