IHostEnvironment 并且启动构造函数中没有 DI .NET Core 3+
IHostEnvironment and no DI in Startup constructor .NET Core 3+
我们正在构建 .NET Core 微服务。
我们的许多微服务使用 HttpClient
通过 ConfigurePrimaryMessageHandler()
登录
对于 .NET Core 2+,我们的方法是
services.AddHttpClient().ConfigurePrimarymessageHandler()
在 ConfigureServices
中 Startup.cs
。我们必须在这里传递一个 ILogger<T>
,我们可以通过将它注入我们的 Startup 构造函数来获得它。
现在我们已经迁移到 IHostEnvironment
,我们不能再使用 DI 将 ILogger<T>
注入 Startup 构造函数并且我们不能将 IServiceCollection
注入 Configure()
。
我的一个想法是创建 HttpClientBuilder
,存储对它的引用,然后在 Configure
中执行 ConfigurePrimaryMessageHandler
... 这没有用。我假设是因为一旦它被构建,它就会被构建所以你需要在 ConfigureServices
.
中进行
所以我最终想到了一个可行但感觉令人讨厌的讨厌的 hack:
我有一个 ILogger<T>
作为我 Startup.cs
的受保护成员。
我将它(它的 null)传递到我的 HttpClientBuilder
s...
然后在Configure()
中注入ILogger<T>
并设置protected成员变量。
呸!
看起来像这样:
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
.
时,感觉这里遗漏了什么
只要 HttpClientLoggingHandler
已注册,您就可以简单地执行 .ConfigurePrimaryMessageHandler<HttpClientLoggingHandler>();
。
ConfigurePrimaryMessageHandler
的 lambda 重载也可以传递给你 IServiceProvider
。从那里,调用 sp.GetRequiredService<T>
。
我们正在构建 .NET Core 微服务。
我们的许多微服务使用 HttpClient
通过 ConfigurePrimaryMessageHandler()
对于 .NET Core 2+,我们的方法是
services.AddHttpClient().ConfigurePrimarymessageHandler()
在 ConfigureServices
中 Startup.cs
。我们必须在这里传递一个 ILogger<T>
,我们可以通过将它注入我们的 Startup 构造函数来获得它。
现在我们已经迁移到 IHostEnvironment
,我们不能再使用 DI 将 ILogger<T>
注入 Startup 构造函数并且我们不能将 IServiceCollection
注入 Configure()
。
我的一个想法是创建 HttpClientBuilder
,存储对它的引用,然后在 Configure
中执行 ConfigurePrimaryMessageHandler
... 这没有用。我假设是因为一旦它被构建,它就会被构建所以你需要在 ConfigureServices
.
所以我最终想到了一个可行但感觉令人讨厌的讨厌的 hack:
我有一个 ILogger<T>
作为我 Startup.cs
的受保护成员。
我将它(它的 null)传递到我的 HttpClientBuilder
s...
然后在Configure()
中注入ILogger<T>
并设置protected成员变量。
呸!
看起来像这样:
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
.
只要 HttpClientLoggingHandler
已注册,您就可以简单地执行 .ConfigurePrimaryMessageHandler<HttpClientLoggingHandler>();
。
ConfigurePrimaryMessageHandler
的 lambda 重载也可以传递给你 IServiceProvider
。从那里,调用 sp.GetRequiredService<T>
。