Внедрение зависимостей и запросы GetServices с универсальными интерфейсами .Net Core - PullRequest
0 голосов
/ 28 февраля 2019

Я связываю себя узлами с дженериками и после некоторого совета.Скажем, у меня есть следующий интерфейс:

public interface IThing<T>
{
  string DoStuff(T input);
}

и следующие реализации:

public class GenericThing<T> : IThing<T> where T : Person
{
    public string DoStuff(T input)
    {
        return typeof(T).Name;
    }
}

и

public class GenericThing2<T> : IThing<T> where T : Animal
{
    public string DoStuff(T input)
    {
        return typeof(T).Name;
    }
}

Зарегистрировано следующим образом:

services.AddSingleton(typeof(IThing<>), typeof(GenericThing<>));
services.AddSingleton(typeof(IThing<>), typeof(GenericThing2<>));

Есть ли способ идентифицировать все объекты, которые реализуют IThing <> в коллекции сервисов?

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете перебирать дескрипторы службы в ServiceCollection и проверять типы, чтобы увидеть, какие из них являются универсальными, и каковы параметры универсального типа.

Как правило, я бы рекомендовал регистрировать конкретные типы в поставщике услуг, а не абстрактные, потому что будет сложно создать службу, которая не имеет конкретного типа!Например,

services.AddSingleton( typeof(IThing<Person>, GenericThing<Person>)

Вы также можете указать строку имени для службы в тех случаях, когда вы хотите зарегистрировать один и тот же интерфейс дважды, потому что в противном случае нет способа различить несколькоуслуги, когда вы пытаетесь получить услугу.Однако обычно стараются не регистрировать один и тот же интерфейс дважды.

sjb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...