HttpClientFactory, как внедрить в класс, я не имею никакого контроля над ядром 2.1 - PullRequest
0 голосов
/ 10 июня 2018

Я хотел бы использовать новый 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 ]

0 голосов
/ 10 июня 2018

В Startup.cs, services.AddHttpClient();

Метод расширения из https://github.com/aspnet/HttpClientFactory/blob/dev/src/Microsoft.Extensions.Http/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs

В вашем классе добавьте аргумент IHttpClientFactory в ваш конструктор.

Есливы хотите использовать его в классе, который его не принимает, вам нужно создать HttpClient в лямбде в Add* и передать его, или зарегистрировать HttpClient в этой лямбде и позволить DI передать его в

services.AddScoped(s => s.GetRequiredService<IHttpClientFactory>().CreateClient())

Есть пример по проекту GitHub: https://github.com/aspnet/HttpClientFactory/blob/dev/samples/HttpClientFactorySample/Program.cs

0 голосов
/ 10 июня 2018

Делегат AddSingleton, использованный в исходном вопросе, принимает IServiceProvider в качестве аргумента параметра.Используйте поставщика для разрешения желаемой зависимости

services.AddSingleton<IThirdPartyService>(sp => 
    new ThirdPartyService(sp.GetService<MyGitHubClient>().Client, someOtherParamHere)
);
...