Я пытаюсь найти границы того, что мы можем сделать с ковариантностью и поддержкой контрвариантности Autofac. Я заметил, что Autofac ContravariantRegistrationSource поддерживает только общие интерфейсы с одним общим параметром, который отмечен ключевым словом в . Это, кажется, ограничивает полезность данной функции, и мне интересно, есть ли у Autofac другие способы расширения поддержки ковариаций и контравариантности.
Должен признать, что я спрашиваю об этом не из-за реального дизайна приложения, над которым я работаю. Я сознательно пытаюсь найти границы Autofac ради образования.
Итак, рассмотрим следующий интерфейс:
public interface IConverter
{
TOut Convert(TIn value);
}
И следующую регистрацию:
public class ObjectToStringConverter : IConverter
И следующую регистрацию:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterType()
.As>();
var container = builder.Build();
С таким дизайном и конфигурацией я бы ожидал, что смогу это сделать:
// This call succeeds because IConverter is
// explicitly registered.
container.Resolve>();
// This call fails, although IConverter is
// assignable from IConverter.
container.Resolve>();
Или, позвольте мне сказать более абстрактно, с приведенными определениями:
public class A { }
public class B : A { }
public class C : B { }
public class AToCConverter : IConverter { ... }