Я разрабатываю структуру классов для своего проекта и столкнулся с проблемой.
У меня есть класс 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;
}
Но при такой записи, получается, что в живых остается только вторая реализация без токена.
Суть моего вопроса в том, как грамотно сделать так. что в одном случае получать буду версию с токеном, а вдругом наоборот?