這個問題是我之前的問題的後續:Autofac: Hiding multiple contravariant implementations behind one composite。Autofac:解決具有輸入和輸出類型參數的變體類型
我試圖找到我們可以用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();
}
}
而下面registation:
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做到這一點?
與1相等的檢查是計數逆變參數的數量;任意數量的其他(非逆變)參數仍然可以被處理。乾杯! –