Внедрение зависимостей для DelegatingHandler с несколькими параметрами и параметрами конструктора - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь использовать внедрение зависимостей для DelegatingHandler, который содержит 2 интерфейса и 1 строку.

public class MessageHandler : DelegatingHandler
{
    private readonly ILogger<MessageHandler> _logger;
    private readonly ISomeService _someService;
    public string Name { get; set; }

    public MessageHandler(ILogger<MessageHandler> logger, ISomeService someService)
    {
        _logger = logger;
        _someService = someService;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        Console.WriteLine($"Doing some other logic with {Name}");
        var response = await base.SendAsync(request, cancellationToken);

        _someService.DoSomething(Name);
        return response;
    }
}

Я добавляю DelegatingHandler к HttpClient через IHttpClientFactory

services.AddHttpClient("github")
    .ConfigureHttpClient(c => { c.BaseAddress = new Uri("https://www.github.com"); })
    .AddHttpMessageHandler<MessageHandler>(); // I want Name property to be 'github'

Однако я также хочу использовать MessageHandler с несколькими HttpClient сотличается Name s

services.AddHttpClient("twitter")
    .ConfigureHttpClient(c => { c.BaseAddress = new Uri("https://www.twitter.com"); })
    .AddHttpMessageHandler<MessageHandler>(); // I want Name property to be 'twitter'

Есть ли способ достичь этого без выполнения:

services.AddHttpClient("github")
    .ConfigureHttpClient(c => { c.BaseAddress = new Uri("https://www.github.com"); })
    .AddHttpMessageHandler(provider =>
    {
        var logger = provider.GetRequiredService<ILogger<MessageHandler>>();
        var someService = provider.GetRequiredService<ISomeService>();
        return new MessageHandler(logger, someService, "github");
    });

1 Ответ

0 голосов
/ 08 мая 2019

Учитывая, что исходный пример имеет следующий конструктор

public MessageHandler(ILogger<MessageHandler> logger, ISomeService someService)
{
    _logger = logger;
    _someService = someService;
}

Вы можете просто разрешить обработчик и затем установить свойство

services.AddTransient<MessageHandler>();
services.AddHttpClient("github")
    .ConfigureHttpClient(c => { c.BaseAddress = new Uri("https://www.github.com"); })
    .AddHttpMessageHandler(provider => {
        var handler = provider.GetRequiredService<MessageHandler>();
        handler.Name = "github";
        return handler;
    });

В любом случае вам нужно будет вручную разрешитьобработчик, чтобы иметь возможность установить это строковое свойство.

...