具有多个构造函数参数和选项的 DelegatingHandler 依赖注入

MrH*_*Man 3 c# dependency-injection .net-core

我正在尝试对DelegatingHandler包含 2 个接口和 1 个字符串的a 使用依赖项注入。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我将此添加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'
Run Code Online (Sandbox Code Playgroud)

但是我也想使用MessageHandlerwith multiple HttpClientwith different Names

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

有没有办法在不做的情况下实现这一目标:

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");
    });
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 6

鉴于原始示例具有以下构造函数

public MessageHandler(ILogger<MessageHandler> logger, ISomeService someService)
{
    _logger = logger;
    _someService = someService;
}
Run Code Online (Sandbox Code Playgroud)

您可以只解析处理程序,然后设置属性

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;
    });
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都需要手动解析处理程序才能设置该字符串属性。