Как грамотно настроить DI?

Я разрабатываю структуру классов для своего проекта и столкнулся с проблемой.

У меня есть класс WebHelper, который, по сути, является прослойкой между HttpClient и различными моими сервисами. В качестве зависимости он принимает фабрику HttpClientFactory, которая, в свою очередь, умеет возвращать нужные мне клиенты. Сделано это с тем умыслом, что может потребоваться как пустой HttpClient, так и содержащий AuthorizationToken или прочие Headers. Таким образом есть сервис, который общается со сторонним источником данных и ему необходим токен, а также есть пара сервисов не требующих ничего.

Схематически, все это можно изобразить так:
ApplicationSolution
  Application.Site
    Startup (регистрация объектов происходит здесь)
  Application.Core
    WebHelper
    HttpClientFactory
  Application.Service1 (требующий Headers в HttpClient)
  Application.Service2 (использует чистый HttpClient)


Так как в приложении используется DI, все зависимости я прокидываю через контейнер, встроенный в Net.Core. И вот с ним то и есть проблема. Я могу зарегистрировать один WebHelper, но для него мне нужны две фабрики, которые должны подставляться в случае для Service1 и Service2 разные.

Регистрация в Startup:
public void ConfigureServices(IServiceCollection services)
{
    services.AddService1(Configuration);
    services.AddService2(Configuration);
    services.AddMvc();
}

Регистрация в Service1:
public static IServiceCollection AddSerivce1(this IServiceCollection services, IConfigurationRoot configuration)
{
    services.AddSingleton<IHttpClientFactory, HttpClientFactory>(service =>
    {
        var factory = new HttpClientFactory
        {
            Method = () =>
            {
                var jsonType = new MediaTypeWithQualityHeaderValue("application/json");
                var authorizationHeader = new AuthenticationHeaderValue("Basic", token);

                var httpClient = new HttpClient();
                httpClient.DefaultRequestHeaders.Accept.Add(jsonType);
                httpClient.DefaultRequestHeaders.Authorization = authorizationHeader;

                return httpClient;
            }
        };

        return factory;
    });

    services.AddSingleton<IWebHelper, WebHelper>();
    ...            

    return services;
}


Регистрация в Service2:
public static IServiceCollection AddService2(this IServiceCollection services, IConfigurationRoot configuration)
{
    services.AddSingleton<IHttpClientFactory, HttpClientFactory>(
        service => new HttpClientFactory {Method = () => new HttpClient()});

    services.AddSingleton<IWebHelper, WebHelper>();
    ...

    return services;
}


Но при такой записи, получается, что в живых остается только вторая реализация без токена.
Суть моего вопроса в том, как грамотно сделать так. что в одном случае получать буду версию с токеном, а вдругом наоборот?
  • Вопрос задан
  • 257 просмотров
Пригласить эксперта
Ответы на вопрос 1
@spencode
Все описано у "Марк Симан - Внедрение зависимостей в .NET". И в том числе, что такое DI и использование контейнеров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы