В Netcore 2.1 ServiceCollection добавлены общие типизированные HttpClients, которые не разрешаются должным образом - PullRequest
0 голосов
/ 13 сентября 2018

Я столкнулся с проблемой, связанной с добавлением Netcore 2.1 нескольких универсальных типизированных HttpClient к ServiceCollection . Это не работает, как ожидалось, и дает мне странные результаты.

Рассмотрим мой тест

var services = new ServiceCollection();

services.AddHttpClient<IHttpGenericClientFactory<test1>, HttpGenericClientFactory<test1>>(client =>
{
    client.BaseAddress = new Uri("https://test1.com/");
});

services.AddHttpClient<IHttpGenericClientFactory<test2>, HttpGenericClientFactory<test2>>(client =>
{
    client.BaseAddress = new Uri("https://test2.com/");
});

Теперь при попытке разрешить каждый сервис

var provider = services.BuildServiceProvider();

var service1 = provider.GetService<IHttpGenericClientFactory<test1>>();
var service2 = provider.GetService<IHttpGenericClientFactory<test2>>();

Когда я проверяю service1.BaseAddress , значение равно "https://test2.com/" и service2.BaseAddress также" https://test2.com/". Независимо от того, что я пытался сервис всегда разрешает или ссылается на последний типизированный сервис, который был добавлен. Это ошибка в структуре? Кто-нибудь знает, почему это не работает должным образом? Это определенно как-то связано с обычными типизированными http-клиентами.

Мой общий класс и интерфейс

public interface IHttpGenericClientFactory<out T3>
{
    HttpClient HttpClient { get; set; }
    Task<T1> Get<T1, T2>(T2 request, string path);
}

public class HttpGenericClientFactory<T3> : IHttpGenericClientFactory<T3>
{
    public HttpClient HttpClient { get; set; }

    public HttpGenericClientFactory(HttpClient httpClient) => this.HttpClient = httpClient;

    public async Task<T1> Get<T1,T2>(T2 request, string path)
    {
        var response = await HttpClient.GetAsync(path);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsAsync<T1>();
    }
}

1 Ответ

0 голосов
/ 13 сентября 2018

Вы не можете разрешить на основе разницы в аргументе универсального типа аргумента универсального типа.Лучшее, что я могу порекомендовать, - это создать конкретные деривации, на которые вы затем можете явно ссылаться:

public class Test1ClientFactory : HttpGenericClientFactory<Test1> {}

public class Test2ClientFactory : HttpGenericClientFactory<Test2> {}

Затем:

services.AddHttpClient<Test1ClientFactory>(client =>
{
    client.BaseAddress = new Uri("https://test1.com/");
});

services.AddHttpClient<Test2ClientFactory>(client =>
{
    client.BaseAddress = new Uri("https://test2.com/");
});
...