【问题标题】:Can I directly Inject ILogger without LoggerFactory我可以在没有 LoggerFactory 的情况下直接注入 ILogger
【发布时间】:2020-11-04 19:35:25
【问题描述】:

从 IoC 的角度来看,我们应该能够轻松设置和选择接口的实现。

如果我创建了ILogger 的自定义实现,我可以直接将它注入到没有ILoggerFactory-ILoggerProvider-ILogger 结构的控制器中吗?

通过这种方式,我可以减少设置开销并更好地控制 Logger。例如,我可以投射和访问CustomProperty。相比之下,ILoggerFactory-ILoggerProvider-ILogger 链创建的记录器将维护ILoggers 的集合,我无法再访问我的CustomLogger。

代码如下所示。这是一个可行的解决方案吗?

定义自定义记录器

public class CustomLogger : ILogger
{
   public CustomPropertyType CustomProperty;

   public CustomLogger(){...}
   public IDisposable BeginScope<TState>(TState state){...}
   public bool IsEnabled(LogLevel logLevel){...}

   public void Log<TState>(
            LogLevel logLevel,
            EventId eventId,
            TState state,
            Exception exception,
            Func<TState, Exception, string> formatter)
   {
      // Use some info from CustomProperty in while sending the log
   }
}

设置依赖注入

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ILogger, CustomLogger>();
    //Other logic
}

使用CustomLogger 实现访问ILogger

public ExampleController(ILogger logger)
{
    this.logger = logger;
    this.customProperty = (CustomLogger)logger.CustomProperty;
}

【问题讨论】:

    标签: c# asp.net-core .net-core ilogger iloggerfactory


    【解决方案1】:

    是的,您需要提供者。您可以在 .NET Core 应用程序的 Startup 类中添加它。此类代码应如下所示:

    loggerFactory.AddProvider(new CustomLoggerProvider(new CustomLoggerConfiguration()));
    

    Here 是对这种用法的解释。 here 就是一个例子。

    【讨论】:

    • 真的需要 LoggerProvider 吗?从 IoC 的角度来看,我们也可以只做services.AddScoped&lt;ILogger, CustomLogger&gt;() 对吗?还是不推荐使用?
    • 也可以,但提供程序是默认方式,从 Microsoft 文档中可以清楚地看出。 docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/…
    猜你喜欢
    • 2020-12-08
    • 2020-01-27
    • 2014-09-18
    • 1970-01-01
    • 2021-11-18
    • 2019-09-12
    • 1970-01-01
    • 2020-09-04
    • 2013-08-17
    相关资源
    最近更新 更多