Arhn - архитектура программирования

Что означает при использовании службы с заданной областью внедрить службу в Invoke или InvokeAsync?

Я читал документ MS о DI в .Net Core.

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

Я наткнулся на линию

"Предупреждение

При использовании службы с заданной областью в промежуточном программном обеспечении внедрите службу в метод Invoke или InvokeAsync. Не внедряйте через конструктор, потому что это заставляет службу вести себя как синглтон ".

Кто-нибудь, объясните, пожалуйста, что это значит?

Тогда один из наиболее проголосовавших ответов здесь использует инъекцию DI конструктора для службы с ограниченной областью действия. Различия между службами AddTransient, AddScoped и AddSingleton?

01.04.2019

Ответы:


1

Это задокументировано в промежуточном программном обеспечении ASP.NET Core: Зависимости по запросу.

Поскольку промежуточное программное обеспечение создается при запуске приложения, а не для каждого запроса, службы времени жизни с ограниченной областью, используемые конструкторами промежуточного программного обеспечения, не используются совместно с другими типами с внедренными зависимостями во время каждого запроса. Если вы должны совместно использовать определенную службу между вашим промежуточным программным обеспечением и другими типами, добавьте эти службы в подпись метода Invoke. Метод Invoke может принимать дополнительные параметры, которые заполняются DI:

public class CustomMiddleware
{
private readonly RequestDelegate _next;

public CustomMiddleware(RequestDelegate next)
{
    _next = next;
}

// IMyScopedService is injected into Invoke
public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
{
    svc.MyProperty = 1000;
    await _next(httpContext);
}
}
02.04.2019

2

Это очень важная вещь. Ваш класс промежуточного программного обеспечения создается только один раз, то есть его конструктор запускается только один раз. Если у вас есть зависимость с продолжительностью жизни scoped или transient, она должна быть более короткой. Если вам требуется такая зависимость через конструктор, ваше промежуточное ПО зависит от службы с более коротким временем жизни. Контейнер DI может удалить службу после выполнения запроса, оставив вашему промежуточному программному обеспечению службу, которая больше не работает.

Запрашивая его во время выполнения в функции Invoke / InvokeAsync, вы можете использовать временные и ограниченные зависимости. В конструкторе могут потребоваться синглтоны, поскольку они имеют такой же срок службы, как и промежуточное ПО.

01.04.2019
  • Я не уверен, что это точно, я считаю, что DI не будет удалять службу, а скорее удалит ее ссылку и оставит объект для сбора мусора. Однако сборка мусора не произойдет, потому что на объект по-прежнему ссылается ваше промежуточное ПО. 18.07.2020
  • Содержимое DI вызовет функцию Dispose службы, если она реализует IDisposable. 18.07.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..