MiF*_*vil 21 c# logging dependency-injection .net-core asp.net-core
MS文档文章"ASP.NET Core中的日志记录简介"提供了2个构造函数注入示例
使用ILogger
private readonly ILogger _logger;
public TodoController(ILogger<TodoController> logger)
{
_logger = logger;
}
Run Code Online (Sandbox Code Playgroud)和ILoggerFactory
private readonly ILogger _logger;
public TodoController( ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<TodoController>();
}
Run Code Online (Sandbox Code Playgroud)我的问题是我应该传递给从我的控制器调用的子类
通过ILoggerFactory我从控制器和每种类别的呼叫称为子类
LoggerFactoryExtensions.CreateLogger<MyChildClass>()
或
将父控制器传递ILogger<MyController>
给从控制器创建的每个子类,并具有非泛型参数ILogger.
在日志中,我更喜欢为每个类看到单独的类别"MyChildClass",而不是所有类都使用父控制器中的"MyController"类别.
但是,每个对象构造中的CreateLogger可能是一项昂贵的操作(例如,请参阅https://github.com/aspnet/Logging/issues/524)
你会推荐哪个选项?你能建议其他方法吗?
Nko*_*osi 14
这更像是一个设计问题.
无论如何,控制器不应该创建子类.这不是控制器应该处理的问题,而是违反SRP(单一责任原则).
我的问题是我应该传递给从我的控制器调用的子类
如果您希望将记录器分开,那么这里没有任何其他选择,只能让子(依赖)类具有自己的记录器.
让子类注入自己的记录器
public class TodoRepository : ITodoRepository {
private readonly ILogger logger;
public TodoRepository(ILogger<TodoRepository> logger) {
this.logger = logger;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
然后将子类注入控制器.
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;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
这样,当子类被解析并注入控制器时,子记录器将得到解决.
归档时间: |
|
查看次数: |
5442 次 |
最近记录: |