gpt4 book ai didi

c# - 具有多个构造函数参数和选项的 DelegatingHandler 的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-04 14:46:24 25 4
gpt4 key购买 nike

我正在尝试对 DelegatingHandler 使用依赖注入(inject)包含 2 个接口(interface)和 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;
}
}

我正在添加这个 DelegatingHandlerHttpClient来自 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
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");
});

最佳答案

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

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;
});

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

关于c# - 具有多个构造函数参数和选项的 DelegatingHandler 的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56031774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com