Проходя мимо лесоруба - PullRequest
       0

Проходя мимо лесоруба

0 голосов
/ 28 февраля 2020

Я реализовал ведение журнала с помощью ведения журнала расширений 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-фу.

...