Передать 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;
    }

    //...
}

таким образом, дочерние регистраторы будут разрешены, когда дочерние классы будут разрешены и введены в контроллер.