![](/img/trans.png)
[英]Pass existing IServiceCollection and ILoggerFactory to Startup in .NET Core 2
[英]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(通常不推荐)
该工厂可以作为静态/全局实例存储在某处。
类似的建议在Accessing the Logging API Outside of a MVC Controller
创建一个位于中心位置的 static class 或项目来保存和环绕主 LoggerFactory 引用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.