【问题标题】:Use IServiceProvider in Microsoft.Extensions.DependencyInjection.AddLogging extension method在 Microsoft.Extensions.DependencyInjection.AddLogging 扩展方法中使用 IServiceProvider
【发布时间】:2022-01-03 10:55:19
【问题描述】:

我有一个应用程序,我想用这样的配置文件来配置 NLog

services.AddLogging(loggingBuilder =>
            {
                loggingBuilder
                    .ClearProviders()
                    .AddNLog(projectInfo.GetNLogConfigPath())
                    .AddFilter("Microsoft", LogLevel.Warning);
            })

但是,我想从 DI 的单例服务中获取此文件位置。我搜索了一个服务提供者,但我发现的只是 loggingBuilder 服务集合(现在projectInfo 是一个局部变量)。

有没有办法在 AddLogging 扩展方法操作中获取服务提供者?

【问题讨论】:

  • 此时,不存在IServiceProviderIServiceProvider 仅在稍后创建容器时创建。这可能意味着您必须手动组合单例服务(及其可能的依赖项)并在 DI 系统中注册该实例。这使您还可以在配置 lambda 中使用该服务。
  • @Steven 好的,我认为该操作是在注册单例时像 lambda 一样稍后执行的。

标签: .net dependency-injection nlog


【解决方案1】:

你可以从NLog.Extensions.Logging使用这个AddNLog()扩展方法

services.AddLogging(loggingBuilder =>
   {
      loggingBuilder.ClearProviders();
      loggingBuilder.AddNLog(serviceProvider => {
         var config = serviceProvider.GetService(typeof(IConfiguration)) as IConfiguration;
         var filename = config["MyValues:Value1"].ToString();
         return NLog.LogManager.Setup().LoadConfigurationFromFile(filename).LogFactory;
      });
   })

那么你就有了这个 appsettings.json:

{ 
   "MyValues": {
      "Value1": "NLog.config"
   }
}

请注意,您也可以只使用NLog-configuration in the appsettings.json

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 2015-03-12
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多