To pytanie jest kontynuacją mojego poprzedniego pytania: Autofac: Hiding multiple contravariant implementations behind one composite.Autofac: Rozwiązywanie typów wariantów z argumentami typu in i out
Próbuję znaleźć granice tego, co możemy zrobić z kowariancją i kontrawariancją Autofaca. Zauważyłem, że Autofac ContravariantRegistrationSource
obsługuje tylko ogólne interfejsy z jednym ogólnym parametrem, który jest oznaczony słowem kluczowym in
. Wydaje się to ograniczać użyteczność tej funkcji i zastanawiam się, czy Autofac ma inne sposoby na rozszerzenie wsparcia kowariancji i kontrawariancji.
Muszę przyznać, że nie pytam o to ze względu na prawdziwy projekt aplikacji, nad którym pracuję. Celowo staram się znaleźć granice Autofac na rzecz edukacji.
więc rozważyć następujący interfejs:
public interface IConverter<in TIn, out TOut>
{
TOut Convert(TIn value);
}
i następujący realizacji:
public class ObjectToStringConverter : IConverter<object, string>
{
string IConverter<object, string>.Convert(object value)
{
return value.ToString();
}
}
i następujący Kontakt Rejestracja:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterType<ObjectToStringConverter>()
.As<IConverter<object, string>>();
var container = builder.Build();
z tym wzorem i konfiguracji, bym spodziewać się, że będzie to możliwe:
// 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>>();
Albo pozwól mi umieścić go bardziej abstrakcyjnie, z podanymi definicjami:
public class A { }
public class B : A { }
public class C : B { }
public class AToCConverter : IConverter<A, C> { ... }
i następnego rejestracji:
builder.RegisterType<AToCConverter>()
.As<IConverter<C, A>>();
spodziewałbym następujące połączenia do osiągnięcia sukcesu:
container.Resolve<IConverter<C, A>>();
container.Resolve<IConverter<B, B>>();
container.Resolve<IConverter<A, C>>();
Jak możemy to zrobić w Autofac?
Sprawdzanie równości przez 1 oznacza liczbę parametrów przeciwstawnych; dowolna liczba innych parametrów (nie będących przeciwwariantami) nadal może być obsługiwana. Twoje zdrowie! –