Как сделать DI для кода, не связанного с запросом в ASP.NET Core?

Нас всех учат использовать Dependency-Injection для кодирования в приложениях ASP.NET Core, но все примеры, которые я до сих пор видел, связанные с поиском служб через DI, относятся к ситуациям, когда метод, имеющий службу вставленная ссылка строго привязана к определенному HTTP-запросу (HttpContext) (например, контроллеры MVC, делегаты маршрутизации).

Расположение службы предупреждается как антишаблон, но я не уверен, как получить правильную ссылку службы (например, DbContext) через DI в коде, который не связан с конкретным HTTP-запросом, например, код, который должен отвечать на сообщения прибывающих через паутину.

Хотя веб-сокет изначально настроен на определенный HTTP-запрос, сообщения будут получать ответы в течение потенциально длительного срока службы веб-сокета (пока длится пользовательский веб-сеанс). Сервер не должен резервировать / тратить соединение DbContext / DB в течение всего этого срока жизни (это может быстро привести к исчерпанию), а скорее получать временное соединение с БД, когда приходит сообщение и требуется ответ; немедленно отбрасывая DbContext / connection - хотя оригинальный HTTP-запрос, который технически настраивал websocket в самом начале пользовательского сеанса, все еще существует.

Я не смог найти ничего другого, кроме как с помощью:

httpContext.RequestServices.GetService(typeof(<MyNeededDbContext>)

Таким образом, я использую исходный httpContext (полученный через DI, когда был установлен веб-сокет), но несколько раз после этого, когда сообщение веб-сокета нуждается в ответе, я могу запросить временный объект службы (в данном примере DbContext), который может быть перерабатывается или объединяется после завершения ответа на сообщение, но пока оригинальный httpContext еще жив.

Кто-нибудь знает о лучшем подходе?

Всего 1 ответ


Вы можете создать новую область обслуживания, чтобы самостоятельно управлять сроком службы;

IServiceProvider provider = ...;
using (var scope = provider.CreateScope())
{
    var context = scope.ServiceProvider.GetService<MyNeededDbContext>();
    ...
}

Есть идеи?

10000