#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; }
-> в основном то же самое со всеми службами, которые используют/являются частью инъекции зависимостей