Asp.net core 2.0 Условный DI - PullRequest
       1

Asp.net core 2.0 Условный DI

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

У меня есть интерфейс, который имеет 2 реализации IMYService MyServiceA MYServiceB

Здесь реализация зависит от некоторых данных в заголовке запроса, используемых строителем служб, например, если заголовок имеет значение internalId, тогда используйте MyServiceA ипередать этот идентификатор службам в конструкторе, а если значение отсутствует, использовать MyServiceB, где в качестве этой конструкции службы не ожидается идентификатор.

Мой контроллер определен с DI для IMyservice

1 Ответ

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

В общем, вам нужна фабрика.Как правило, это отдельный класс, который отвечает за управление экземплярами определенного подобного типа вещей и возвращает соответствующий экземпляр на основе какого-либо соглашения или условия.Например, если вы использовали IHttpClientFactory, вы увидите один в действии.

Поскольку реализация зависит от запроса, вы можете немного обмануть, используя «фабричную» перегрузку AddScoped:

services.AddScoped<IMyService>(p => 
{
    // return either MyServiceA or MyServiceB
});

Параметр p лямбды на самом деле является экземпляром области действия IServiceProvider, так что вы можете сделать что-то вроде вытаскивания IHttpContextAccessor, чтобы посмотреть детали запроса.

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