我们正在构建.NET Core微服务。
我们的许多微服务都通过HttpClient
使用ConfigurePrimaryMessageHandler()
日志记录
[使用.NET Core 2+,我们的方法是去
services.AddHttpClient().ConfigurePrimarymessageHandler()
的ConfigureServices
中的[Startup.cs
。我们必须在此处传递ILogger<T>
,然后将其注入到我们的Startup构造函数中即可。
现在我们已迁移到IHostEnvironment
,我们将无法再使用DI将ILogger<T>
注入到启动构造函数中,而无法将IServiceCollection
注入到Configure()
中。
[我的一个想法是创建HttpClientBuilder
,存储对它的引用,然后在ConfigurePrimaryMessageHandler
中进行Configure
...这不起作用。我假设是因为一旦构建完成,便要构建它,因此您需要在ConfigureServices
中进行操作。
所以我最终想出了一个有效的讨厌的方法,但是感觉很讨厌:
我有一个ILogger<T>
作为我的Startup.cs
的受保护成员。
我将其(无效)传递给我的HttpClientBuilder
s ...
然后在Configure()
中,我注入ILogger<T>
并设置受保护的成员变量。
糟糕!
看起来像这样:
class Startup
{
protected ILogger<HttpClientLoggingHandler> _logHack;
public void ConfigureServices(IServiceCollection)
{
services.AddHttpClient<T>().ConfigurePrimaryMessageHandler(()=>{ new
HttpClientLoggingHandler(_logHack, otherstuff) });
}
public void Configure(IApplicationBuilder bld, ILogger<T> logForHack, otherstufffordi)
{
_logHack = logForHack; // note this works, but is this really a good design pattern?
}
}
所以这确实有效...但是感觉不像是一种很棒的设计模式。有任何建议吗?这真的是我们应该采取的方法吗?当我们迁移到IHostEnvironment
时,感觉这里有些遗漏。
只要注册了.ConfigurePrimaryMessageHandler<HttpClientLoggingHandler>();
,您就可以简单地进行HttpClientLoggingHandler
。
ConfigurePrimaryMessageHandler
的lambda重载也可以为您传递IServiceProvider
。从那里,呼叫sp.GetRequiredService<T>
。