Как внедрить список объектов, который реализует определенный интерфейс generi c в StructureMap? - PullRequest
1 голос
/ 23 апреля 2020

У меня есть два интерфейса:

public interface IResult
{}

public interface IDataFetcher<T> where T : IResult
{
   T Fetch();
}

В моем обработчике я хочу внедрить все службы, которые реализуют IDataFetcher<T>:

public class MyHandler
{
    public MyHandler(IEnumerable<IDataFetcher<IResult>> fetchers)
    {
        // etc.
    }
}

Я сейчас регистрирую IDataFetchers следующим образом:

public MyRegistry()
{
    Scan(scan =>
    {
        scan.Assembly("name_of_assembly_containg_all_the_classes");
        scan.AddAllTypesOf<IResult>();
        scan.ConnectImplementationsToTypesClosing(typeof(IDataFetchers<>));
    });
}

Когда я устанавливаю точку останова в конструкторе MyHandler переменная fetchers пуста (не ноль)

Что мне нужно сделать, чтобы исправить это? Чтобы убедиться, что сборщики заполнены реализациями IDataFetcher?

1 Ответ

1 голос
/ 23 апреля 2020

После нескольких часов поисков и поисков я нашел ответ. Я сделал все правильно, за исключением одной вещи: сделать IDataFetcher ковариантным:

public interface IDataFetcher<out T> where T : IResult
{}

Это имеет смысл, потому что я использую конкретные типы в обобщенных c типах:

public class SomeClass : IResult
{
}

public class ConcreteFetcher : IDataFetcher<SomeClass>
{
    public SomeClass Fetch()
    {
        // do something
    }
}

Ура!

...