MS docs "Introduction to Logging in ASP.NET Core"文章提供了2个构造函数注入(inject)的示例
使用的
private readonly ILogger _logger;
public TodoController(ILogger<TodoController> logger)
{
_logger = logger;
}
private readonly ILogger _logger;
public TodoController( ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<TodoController>();
}
我的问题是我应该如何传递给从 Controller 调用的子类
在每堂课中
LoggerFactoryExtensions.CreateLogger<MyChildClass>()
或ILogger<MyController>
传递给每个子类由 Controller 创建并具有非通用参数ILogger。
在日志中,我更愿意为每个类看到单独的类别“MyChildClass”,而不是所有类都使用来自父 Controller 的类别“MyController”。
但是,每个对象构造中的CreateLogger可能是一项昂贵的操作(例如,参见https://github.com/aspnet/Logging/issues/524)
您会推荐哪个选项?您能建议其他方法吗?
最佳答案
这更多是一个设计问题。
无论如何, Controller 不应创建子类。这不是 Controller 应该处理的问题,并且违反了SRP(单一责任原则)。
如果您希望分开记录器,那么除了让子(依赖)类拥有自己的记录器之外,这里别无选择。
让子类注入(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/