HttpClientFactory, как внедрить в класс, я не имею никакого контроля над ядром 2.1
Я хотел бы использовать новый HttpClientFactory
и у меня проблемы с настройкой.
У меня есть следующее (просто хорошие примеры, которые я собрал, чтобы объяснить мою точку зрения)
public class MyGitHubClient
{
public MyGitHubClient(HttpClient client)
{
Client = client;
}
public HttpClient Client { get; }
}
Тогда по моему webapi.Startup
я имею
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient<MyGitHubClient>(client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
//etc..
});
//NOW I get error "Class name is not valid at this point" for "MyGitHubClient" below
services.AddSingleton<IThirdPartyService>(x => new ThirdPartyService(MyGitHubClient,someOtherParamHere));
///etc...
}
Сторонний конструктор
public ThirdPartyService(HttpClient httpClient, string anotherParm)
{
}
Как я могу использовать HttpClientFactory
когда мне нужно позвонить в класс, который я не могу контролировать?
2 ответа
AddSingleton
делегат, используемый в первоначальном вопросе, занимает IServiceProvider
в качестве аргумента параметра. Используйте поставщика для разрешения желаемой зависимости
services.AddSingleton<IThirdPartyService>(sp =>
new ThirdPartyService(sp.GetService<MyGitHubClient>().Client, someOtherParamHere)
);
В Startup.cs, services.AddHttpClient();
Метод расширения из https://github.com/aspnet/HttpClientFactory/blob/dev/src/Microsoft.Extensions.Http/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs
В своем классе добавьте IHttpClientFactory
аргумент вашего конструктора.
Если вы хотите использовать его в классе, который его не принимает, вам нужно создать HttpClient
в лямбде в Add*
и передать его, или зарегистрируйтесь HttpClient
сам с этим лямбда и пусть я передам его в
services.AddScoped(s => s.GetRequiredService<IHttpClientFactory>().CreateClient())
Пример проекта GitHub: https://github.com/aspnet/HttpClientFactory/blob/dev/samples/HttpClientFactorySample/Program.cs