Подтвердить что ты не робот

Пропустить ILogger или ILoggerFactory для конструкторов в AspNet Core?

В статье MS docs "Введение в ведение журнала в ASP.NET Core" приводятся 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> для каждого дочернего класса созданный с контроллера и имеющий не общий параметр ILogger.

В журналах я предпочитаю видеть отдельную категорию "MyChildClass" для каждого класса, а не все классы используют категорию "MyController" из родительского контроллера.
Однако CreateLogger в каждой конструкции объекта может быть дорогостоящей операцией (например, см. https://github.com/aspnet/Logging/issues/524)

Какой вариант вы порекомендуете? Можете ли вы предложить какой-либо другой подход?

4b9b3361

Ответ 1

Это больше проблема дизайна.

В любом случае, контроллер не должен создавать дочерние классы. Это не проблема, с которой диспетчер должен иметь дело с 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;
    }

    //...
}

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