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)
鉴于原始示例具有以下构造函数
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)
无论哪种方式,您都需要手动解析处理程序才能设置该字符串属性。
| 归档时间: |
|
| 查看次数: |
2281 次 |
| 最近记录: |