Как найти Внедрение Сервиса по типу? - PullRequest
1 голос
/ 17 апреля 2020

У меня есть две службы в моем приложении:

ServiceA : IService
ServiceB : IService

Я хочу передать Type информацию об услуге, которая мне нужна (ServiceA или ServiceB), во второй класс.

Затем я хочу захватить эту службу во втором классе.

IEnumerable<IService> services // i get it from DI by constructor, length = 2
                               // becuase i have two implementations of it
services.FirstOrDefault(x => ... and how to grab for example ServiceA?)

Так что же я должен передать своему второму классу, чтобы получить реализацию IService of ask Type? Эти сервисы существуют в одной сборке, и я передаю список этих сервисов. NET Core DI Container.

Сервисы и все классы существуют в одном проекте, но в разных пространствах имен (но имеют ссылку)

РЕДАКТИРОВАТЬ:

Извините, что не уточнил это, мне нужно передать информацию об объекте string, потому что я посылаю JSON к нему. Поэтому мне нужно получить некоторую информацию о Service в виде строки, а затем десериализовать ее во втором классе и на основе строки найти соответствующий сервис из services списка

EDIT2:

Пример, что я хочу сделать:

// logic, i know i need ServiceA, pseudocode:

return ServiceB.GetType().ToString();

// then, serialize it to json:

string json = object.Serialize(); // object where i have property for example : "service": "ServiceB"

// second class

public Task Handler(Object input)
{
   // deserialize input;
   // and grab service
   var service = services.FirstOrDefault(x => x .....);
}

1 Ответ

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

Вам необходимо получить тип объекта, который выполняется с помощью x.GetType(), и сравнить его с типом ServiceA (typeof(ServiceA)).

Пример LinqPad (просто скопируйте + вставить в LinqPad):

void Main()
{
    IEnumerable<IService> services = new List<IService>() { new ServiceA(),
                                                            new ServiceB() };
    var service = services.FirstOrDefault(x => x.GetType()==typeof(ServiceA));
    service.Dump();
}


class ServiceA : IService { }
class ServiceB : IService { }
interface IService { }

Запустите его. NET Fiddle

В качестве альтернативы вы также можете использовать service.GetType().Name чтобы получить имя типа в виде строки, а затем сопоставить строку, например:

string strService = "ServiceA";
var service = services.FirstOrDefault(x => GetType().Name==strService);

Если у вас разные пространства имен, вам может потребоваться добавить операторы using или сделать полную ссылку на ServiceA.

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