IHostEnvironment,启动构造函数.NET Core 3+中没有DI

问题描述 投票:0回答:1

我们正在构建.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时,感觉这里有些遗漏。

c# .net-core dependency-injection dotnet-httpclient
1个回答
0
投票

只要注册了.ConfigurePrimaryMessageHandler<HttpClientLoggingHandler>();,您就可以简单地进行HttpClientLoggingHandler

ConfigurePrimaryMessageHandler的lambda重载也可以为您传递IServiceProvider。从那里,呼叫sp.GetRequiredService<T>

© www.soinside.com 2019 - 2024. All rights reserved.