繁体   English   中英

将 ILogger 或 ILoggerFactory 传递给 AspNet Core 中的构造函数?

[英]Pass ILogger or ILoggerFactory to constructors in AspNet Core?

MS文档文章《ASP.NET Core中的Logging简介》给出了2个构造函数注入的例子

  • 使用ILogger

     private readonly ILogger _logger; public TodoController(ILogger<TodoController> logger) { _logger = logger; }
  • ILoggerFactory

     private readonly ILogger _logger; public TodoController( ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<TodoController>(); }

我的问题是我应该将什么传递给从我的 controller 调用的

  • ILoggerFactory传递给从 controller 调用的子类,并在每个 class 调用LoggerFactoryExtensions.CreateLogger<MyChildClass>()

  • 将父控制器的ILogger<MyController>传递给从 controller 创建并具有非通用参数 ILogger 的每个子 class。

在日志中,我更喜欢看到每个 class 的单独类别“MyChildClass”,而不是所有类都使用来自父 controller 的类别“MyController”。
然而,每个 object 构造中的 CreateLogger 可能是一项昂贵的操作(例如,请参阅https://github.com/as.net/Logging/issues/524

您会推荐哪个选项? 你能建议任何其他方法吗?

这更像是一个设计问题。

无论如何,控制器都不应该创建子类。 这不是控制器应该处理的问题,并且违反了 SRP(单一职责原则)。

我的问题是我应该将什么传递给从我的控制器调用的子类

如果您的偏好是将记录器分开,那么除了让子(依赖)类拥有自己的记录器之外,这里真的没有其他选择。

让子类注入自己的记录器

public class TodoRepository : ITodoRepository {
    private readonly ILogger logger; 

    public TodoRepository(ILogger<TodoRepository> logger) { 
        this.logger = logger;   
    }
  
    //...
}

然后将子类注入控制器。

public class TodoController : Controller {
    private readonly ILogger logger;
    private readonly ITodoRepository todoRepository;

    public TodoController(ILogger<TodoController> logger, ITodoRepository todoRepository) {
        this.logger = logger;   
        this.todoRepository = todoRepository;
    }

    //...
}

这样,当子类被解析并注入控制器时,子记录器将得到解析。

我应该为库使用 ILogger、ILogger<T>、ILoggerFactory 还是 ILoggerProvider?中讨论了如何向库提供记录器?

如果有人需要在 Startup 之外访问 ILoggerFactory(通常不推荐)

该工厂可以作为静态/全局实例存储在某处。

(来自在 EF Core 中使用 Microsoft.Extensions.Logging

类似的建议在Accessing the Logging API Outside of a MVC Controller

创建一个位于中心位置的 static class 或项目来保存和环绕主 LoggerFactory 引用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM