【问题标题】:IHostEnvironment and no DI in Startup constructor .NET Core 3+启动构造函数.NET Core 3+ 中的 IHostEnvironment 和没有 DI
【发布时间】:2020-01-31 15:48:01
【问题描述】:

我们正在构建 .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)传递到我的 HttpClientBuilders...

然后在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 时,感觉这里漏掉了一些东西。

【问题讨论】:

  • 你的意思是,迁移到 IWebHostEnvironment?
  • 我不明白这个问题 - 你发布的是 .NET Core 2.2 也是如何工作的。 Startup.cs 的构造函数没有接收应用程序的记录器或 DI。它收到了主机的记录器。主机的记录器仅在配置期间用于记录 - 在应用程序的记录配置运行之前
  • 之前发生的事情是,您配置的 HttpClientHandler 最终会使用主机的日志配置,而不是应用程序的。如果您想添加例如 Serilog,将不同的消息存储在不同的文件中等,HttpClientHandler 将绕过所有这些

标签: c# .net-core dependency-injection dotnet-httpclient


【解决方案1】:

只要注册了HttpClientLoggingHandler,您就可以简单地使用.ConfigurePrimaryMessageHandler&lt;HttpClientLoggingHandler&gt;();

ConfigurePrimaryMessageHandler 的 lambda 重载也可以传递给您一个 IServiceProvider。从那里拨打sp.GetRequiredService&lt;T&gt;

【讨论】:

  • 谢谢丹尼尔,我有点晚了,但有机会验证一下。效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2019-05-21
  • 2017-07-28
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多