Я реализовал ведение журнала с помощью ведения журнала расширений Microsoft, и это прекрасно работает. В сервисе или контроллере DI отлично работает, потому что система создает объекты класса и автоматически вводит необходимые зависимости. Например:
public class ParentClass
{
ILogger<ParentClass> _logger;
public ParentClass (ILogger<ParentClass> logger)
{
_logger = logger;
}
}
работает как брелок. Тем не менее, мне нужно войти и в другие классы. У меня вопрос, как я могу заставить DI предоставлять регистратор для классов, которые я создаю с помощью «new»?
public class ChildClass
{
ILogger<ChildClass> _logger;
public ChildClass (ILogger<ChildClass> logger)
{
_logger = logger;
}
}
Это выглядит нормально, но как мне использовать "new" для создания этого дочернего класса? Я мог бы попытаться сгенерировать ILogger для передачи конструктору ChildClass, но я бы хотел, если это вообще возможно, избежать анти-паттернов типа «локатор служб». Кроме того, это скомпилирует:
public class ChildClass
{
ILogger<ParentClass> _logger;
public ChildClass (ILogger<ParentClass> logger)
{
_logger = logger;
}
}
public class ParentClass
{
ILogger<ParentClass> _logger;
public ParentClass (ILogger<ParentClass> logger)
{
_logger = logger;
}
public void useChild()
{
var c = new ChildClass(_logger);
// do something with ChildClass
}
}
Но это создает (совершенно неприемлемо) жестко закодированную зависимость между ParentClass и ChildClass. Итак, каков правильный ответ, чтобы войти в класс, созданный как «новый» в моем коде? Я уверен, что есть ответ, но пока он ускользает от моих навыков Google-фу.