MS 文档文章 "Introduction to Logging in ASP.NET Core"给出了2个构造函数注入(inject)的例子
使用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>()
或者传递父 Controller 的
ILogger<MyController>
给每个 child 类(class) 从 Controller 创建并具有非通用参数 ILogger。
在日志中,我更喜欢为每个类看到单独的类别“MyChildClass”,而不是所有类都使用父 Controller 中的类别“MyController”。
然而,每个对象构造中的 CreateLogger 可能是一项昂贵的操作(例如,参见 https://github.com/aspnet/Logging/issues/524)
您会推荐哪个选项?你能推荐任何其他方法吗?
最佳答案
这更像是一个设计问题。
无论如何 Controller 都不应该创建子类。这不是 Controller 应该处理的问题,并且违反了 SRP(单一责任原则)。
My question is what should I pass to child classes called from my controller
如果您的偏好是分离记录器,那么除了让子(依赖)类拥有自己的记录器外,别无选择。
让子类注入(inject)自己的记录器
public class TodoRepository : ITodoRepository {
private readonly ILogger logger;
public TodoRepository(ILogger<TodoRepository> logger) {
this.logger = logger;
}
//...
}
然后将子类注入(inject) Controller 。
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;
}
//...
}
这样,当子类被解析并注入(inject) Controller 时,子记录器将被解析。
关于c# - 将 ILogger 或 ILoggerFactory 传递给 AspNet Core 中的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013762/