Biorąc pod uwagę następujące klasy: Klasa publiczna HTTPHelper {Private Readonly Httpclient Client; publiczny httphelper (httpclientny klient) {ten.Client = klient; } } Klasa publiczna ...

2
smolesen 20 marzec 2021, 17:29

3 odpowiedzi

Najlepsza odpowiedź

Innym sposobem jest skonfigurowanie go przez nazwę fabryki:

//configure your clients
services.AddHttpClient("clientName1", client => { 
   //configure
});

services.AddHttpClient("clientName2", client => { 
   //configure
});

//configure your services
services.AddScoped<ServiceA>(sp =>
    {
        var client = sp.GetRequiredService<IHttpClientFactory>()
            .CreateClient("clientName1");
        return new ServiceA(client);
    });

services.AddScoped<ServiceB>(sp =>
    {
        var client = sp.GetRequiredService<IHttpClientFactory>()
            .CreateClient("clientName2");
        return new ServiceB(client);
    });

Problem z tym podejściem jest, że jawnie musisz zdefiniować resolver do serwisu A & B.

1
Stefan 20 marzec 2021, 14:56

Skończyło się na tym:

sc.AddSingleton(sp =>
{
     var client = sp.GetRequiredService<IHttpClientFactory>()
           .CreateClient(typeof(ServiceA).FullName);
     return new ServiceA(new HttpHelper(client));
 })
 .AddHttpClient<HttpHelper>(typeof(ServiceA).FullName)
 .ConfigureHttpClient((sp, client) => { client.BaseAddress = new Uri("http://domainA"); });

sc.AddSingleton(sp =>
{
     var client = sp.GetRequiredService<IHttpClientFactory>()
                  .CreateClient(typeof(ServiceB).FullName);
     return new ServiceB(new HttpHelper(client));
})
.AddHttpClient<HttpHelper>(typeof(ServiceB).FullName)
.ConfigureHttpClient((sp, client) => { client.BaseAddress = new Uri("http://domainB"); });

Wydaje się pracować tak, jak chciałem ....

1
smolesen 20 marzec 2021, 17:30

Wolałbym coś zrobić w ten sposób.

public class ServiceA
    { 
        private readonly HttpClient httpClient;

        public ServiceA(HttpClient httpClient)
        { 
            this.httpClient = httpClient;
        }
    }
    public class ServiceB
    {       
        private readonly HttpClient httpClient;
        public ServiceB(HttpClient httpClient)
        {            
            this.httpClient = httpClient;
        }
    }

I w konfiguracji.

services.AddHttpClient<ServiceA>().ConfigureHttpClient(client =>
            {
                client.BaseAddress = new Uri("http://domainA");
            });
            services.AddHttpClient<ServiceB>().ConfigureHttpClient(client =>
            {
                client.BaseAddress = new Uri("http://domainB");
            });

Uwaga :

W twoim przypadku dwie rzeczy są problematyczne.

  1. AddSingleton do usług i usług
  2. AddHttpClient jest problemem, ponieważ staje się singleton i tylko jeden zainicjowany.
2
dotnetstep 20 marzec 2021, 14:55