Autofac: Решение типов вариантов с аргументами типа in и out

Этот вопрос является продолжением моего предыдущего вопроса: Autofac: Скрывая несколько противопоставляемых реализаций за одним композитным .

Я пытаюсь найти границы того, что мы можем сделать с ковариантностью и поддержкой контрвариантности Autofac. Я заметил, что Autofac ContravariantRegistrationSource поддерживает только общие интерфейсы с одним общим параметром, который отмечен ключевым словом в . Это, кажется, ограничивает полезность данной функции, и мне интересно, есть ли у Autofac другие способы расширения поддержки ковариаций и контравариантности.

Должен признать, что я спрашиваю об этом не из-за реального дизайна приложения, над которым я работаю. Я сознательно пытаюсь найти границы Autofac ради образования.

Итак, рассмотрим следующий интерфейс:

public interface IConverter
{
    TOut Convert(TIn value);
}

И следующую регистрацию:

public class ObjectToStringConverter : IConverter
{
    string IConverter.Convert(object value)
    {
        return value.ToString();
    }
}

И следующую регистрацию:

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 { ... }

И следующую регистрацию:

builder.RegisterType()
    .As>();

Я ожидал бы следующих звонков:

container.Resolve>();
container.Resolve>();
container.Resolve>();

Как мы можем это сделать с Autofac?

9
задан Community 23 May 2017 в 02:07
поделиться