Таким образом, в приложения ASP.NET Core встроено внедрение зависимостей. А с помощью Entity Framework Core вы можете легко получить экземпляр DbContext с заданной областью действия из метода действия контроллера.
Но все это ограничивается действиями контроллера. Если вам нужно запустить длительную фоновую задачу из действия, которое будет взаимодействовать с представлением в браузере с помощью других средств, таких как WebSocket, тогда у вас внезапно ничего не останется. Фоновая задача не может использовать DbContext действия, потому что он был ограничен и удален при возврате действия.
Простым способом было бы использовать то, что люди называют локатором услуг. Это статическая копия некоторого IServiceProvider для последующего доступа и разрешения службы. (ASP.NET Core 2.1 может потребовать другого подхода, поскольку я читал в этом комментарии.) Но куда бы я ни посмотрел, это описывается как антипаттерн. Это усложняет тестирование и скрывает зависимости. Хорошо.
Итак, какое решение рекомендуется для этого сценария? Я где-то в глуши. Фоновая задача, которая может быть запущена из планировщика вместо действия контроллера. Никаких HTTP-запросов нет. Что DI может здесь сделать для меня? Есть ли решение без возврата к антипаттернам? Я уверен, что создатели ASP.NET Core D я об этом подумали.
Есть ли способ разрешить там службы или изменить мою архитектуру так, чтобы сама фоновая задача каким-то образом выходила из DI?
Обновление: Запрошено в комментарии, пример: действие контроллера что-то запускает. Это займет много времени, как сканирование сети. Представление возвращается с чем-то вроде «Уважаемый пользователь, пожалуйста, подождите, пока вы увидите этот индикатор выполнения». Работа продолжается в фоновом режиме, непрерывно отправляя информацию о ходе и / или результатах в браузер. (Вместо этого браузер может также опрашивать прогресс.) Фоновой задаче требуется доступ к базе данных для хранения результатов сканирования. Когда сканирование завершено, браузер может получить его с помощью другого действия. Поэтому, если бы фоновая задача просто использовала бы DbContext действия контроллера, это стало бы непригодным для использования после завершения действия.
Другой пример - фоновая служба, которая вообще не связана с запросом. Сервис, который регулярно проверяет базу данных, а затем что-то делает. Для этого также нужен DbContext, и некуда даже пытаться его украсть.