Передать ILogger или ILoggerFactory конструкторам в ядре AspNet?
статья MS docs "введение в систему ASP.NET ядро" дает 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>(); }
мой вопрос в том, что я должен передать ребенок занятия с контроллером
передать ILoggerFactory для мои дочерние классы вызываются из контроллера и в каждом вызове класса
LoggerFactoryExtensions.CreateLogger<MyChildClass>()
илипередать Родительский контроллер
ILogger<MyController>
для каждого ребенка класса созданный от регулятора и имеющ non-generic параметр ILogger.
в журналах я предпочитаю видеть отдельную категорию "MyChildClass" для каждого класса, а не все классы используют категорию "MyController" от родительского контроллера.
Однако CreateLogger в каждом объекте строительство может быть дорогостоящей операцией (например, см. https://github.com/aspnet/Logging/issues/524)
какой вариант вы посоветуете? Вы можете предложить другой подход?
1 ответов
Это больше вопрос дизайна.
контроллер не должен создавать дочерние классы в любом случае. Это не является проблемой, с которой контролер должен иметь дело, и идет вразрез с SRP (принцип единой ответственности).
мой вопрос в том, что я должен пройти на занятия ребенка с контроллером
Если вы предпочитаете отделять регистраторы, то здесь действительно нет другого выбора, кроме как иметь дочерние (зависимые) классы есть свои регистраторы.
у дочерних классов есть собственный logger
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;
}
//...
}
таким образом, дочерние регистраторы будут разрешены, когда дочерние классы будут разрешены и введены в контроллер.