我有一个Worker Service应用程序中的类,它由两个需要被注入的字符串参数构成,因此无法注册为服务:
public MyService(ILogger<MyService> logger, HttpClient client, string username, string password)
{
this._logger = logger;
this._client = client;
this.Username = username;
this.Password = password;
}
我定义了这个构建器:
var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureServices((c, s) =>
{
s.AddHttpClient<MyService>(client => {
client.BaseAddress = new Uri("http://www.myserviceurl.com");
});
s.AddTransient<IMyService>(sp => new MyService(
sp.GetRequiredService<ILogger<MyService>>(),
sp.GetRequiredService<HttpClient>(),
"username",
"password"
));
});
但是通过IServiceProvider.GetRequiredService()注入的HttpClient并不是我在IServiceCollection中使用AddHttpClient()方法添加的那个,因为BaseAddress(以及其他我为了简洁省略的默认标头)为空
相反,如果我从构造函数中删除另外两个字符串参数,并让IServiceProvider解析依赖关系,我就可以得到正确的HttpClient实例
我肯定可能没有理解GetRequiredService的工作原理,我仍在学习IServiceProvider的工作原理,我想了解我的错误所在。
编辑:
另外,我发现如果我使用命名客户端而不是类型化客户端
s.AddHttpClient("MyService",client => {
client.BaseAddress = new Uri("http://www.myserviceurl.com");
});
我通过以下方式解决依赖关系:
s.AddTransient<IMyService>(sp => new MyService(
sp.GetRequiredService<ILogger<MyService>>(),
sp.GetRequiredService<IHttpClientFactory>().CreateClient("MyService"),
"username",
"password"
));
一切都如预期的那样工作。与Typed HttpClient有何区别?
GetRequiredService<HttpClient>()
?定义一个类型化的 http 客户端的原因是,这样你就不必将HttpClient
注入到你的服务中。相反,你注入IMyService
。 - Dimitris Maragkos