Использование расширений ведения журнала Microsoft с типизированными регистраторами при создании экземпляров объектов в коде?

#c# #.net-core

Вопрос:

Изучение работы с расширениями ведения журнала Microsoft, DI и Serilog. Для классов контроллеров это просто работает, т. Е. Я добавил ILogger в конструктор и сохранил локальную ссылку на регистратор, а DI делает все остальное.

Однако я не уверен, как реализовать это для классов, которые создаются контроллером. Например:

 public class MyController: ControllerBase
{
     private readonly ILogger<MyController> _logger;
     public MyController(ILogger<MyController> logger) ( _logger = logger; }

     public bool DoWork() 
    {
         MyWorker w = new MyWorker(???); 
         w.DoSomething();
    }
}

public class MyWorker
{
     private readonly ILogger<MyWorker> _logger;
     public MyWorker(ILogger<MyWorker> logger) 
     {
          _logger = logger;
     }

     public void DoSomething()
     {
          _logger.Debug("DoSomething");
     }

}
 

Как должен выглядеть этот код при создании экземпляра MyWorker, чтобы он работал с DI?

Комментарии:

1. Пока MyWorker он зарегистрирован как часть контейнера служб (т. е. services.AddScoped<MyWorker>(); ), инъекция конструктора будет работать и там. Если вы не используете стандартный контейнер DI, который предоставляет вам .NET/ASP.NET core ( docs.microsoft.com/en-us/aspnet/core/fundamentals/… ). Последующие действия: в этом случае также будет необходимо не создавать экземпляр вручную MyWorker MyController , но также вводить его в качестве зависимости (которая должна быть автоматически устранена, как только она будет зарегистрирована в контейнере служб)

2. «Я не уверен, как реализовать это для классов, которые создаются контроллером» — > вы никогда не создаете классы, отличные от моделей/сущностей. Службы всегда вводятся с помощью инъекции конструктора

3. @CamiloTerevinto — Как бы вы изменили код, чтобы вам не пришлось создавать экземпляр MyWorker с помощью нового?

4. Добавьте a public interface IMyWorker { void DoSomething(); } и внедрите его MyWorker , затем добавьте его в инъекцию зависимостей и сделайте private readonly IMyWorker _myWorker; public MyController(IMyWorker myWorker) { _myWorker = myWorker; } -> в основном то же самое со всеми службами, которые используют/являются частью инъекции зависимостей