Краткое обсуждение этого процесса

Звучит не чисто и не соответствует назначению прицелов, верно? Обычно, если у вас есть служба с ограниченной областью действия, ее можно использовать только в других службах с той же областью действия. Scope — это закрытая среда одного взаимосвязанного запроса. Например, когда вы делаете запрос к API, этот API может обрабатывать ваш запрос в закрытой области, которая создает экземпляры служб, которые используются только внутри этой области.

В отличие от этого, одноэлементная служба размещается один раз за время существования приложения и удаляется только после завершения работы приложения. Естественно, вы не можете ссылаться на сервис закрытой области видимости в сервисе singleton, да и в большинстве случаев не должны.

Однако очень мало случаев, когда имеет смысл размещать синглтон, использующий службы с ограниченной областью действия. Например, в моем последнем проекте я размещаю Приложение функций на Azure, где каждый запрос создает одну область действия. Это приложение-функция также использует синхронизированные триггеры и внутренние триггеры, которые будут иметь область действия приложения.

Теперь каждый раз, когда поступает внутренний запрос, приложение создает новую область, содержащую новые HttpClients, BlobClients и некоторые другие. Конечно, бэкенд-запросов очень много… Тогда приложение создало бы сотни тысяч клиентов, которые тоже можно было бы использовать повторно. Однако сделать их одноэлементными невозможно, так как служба аутентификации должна иметь область действия.

Если вы никогда не работали с Dependency Injection, посмотрите эту документацию.

Решение состоит в том, чтобы просто вручную создать область действия, которая имеет такое же время жизни, как и синглтон.

IServiceScopeFactory

Служба, отвечающая за создание новых областей видимости, называется: IServiceScopeFactory. Интерфейс можно найти в библиотеке Microsoft.Extensions.DependencyInjection.Abstractions. Вы можете просто поместить этот интерфейс внутрь конструктора и получить возможность создать свою собственную область видимости. Вот код:

Теперь вам нужно только добавить эту службу в качестве синглтона в контейнер DependencyInjection, и все готово!

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

Метод расширения AddScopedSingleton()

Поскольку вы добавляете службы в IServiceCollection, я хотел бы добавить свою службу Scoped Singleton точно так же, без необходимости изменять саму службу. Вот почему я создал следующие методы:

Как видите, метод технически добавляет экземпляр singleton в IServiceCollection, однако сам сервис создается внутри новой области видимости.

Эти расширения теперь позволяют моему приложению «Функции» размещать только одну службу каждого типа за время существования приложения в случае области действия приложения. Помните, что вы не должны использовать этот метод для обертывания всех ваших служб с заданной областью. Области обычно необходимы для большинства запросов к API, и только небольшая их часть может работать внутри синглтона.

Спасибо, что нашли время прочитать эту статью. Надеюсь, вы нашли его информативным, познавательным и интересным.
Мы очень ценим вашу поддержку и участие.

Если вы заинтересованы в том, чтобы быть в курсе последних тенденций, советов и приемов для чистой архитектуры, чистого кодирования и новейших технологических стеков, особенно в контексте C #, .NET и Angular, я был бы признателен. если вы решили следовать за мной.

Удачного дня!

Если вы еще не используете Medium для ежедневного расширения своих знаний, сейчас самое время начать! С Medium вы можете легко получить больше знаний по высокопрофессиональным темам, публиковать качественный контент и охватить более широкую аудиторию. Чтобы начать, просто создайте учетную запись Medium, используя эту ссылку:

Присоединиться к Medium сейчас

Таким образом, вы получите доступ к мощной платформе, которая поможет вам общаться с новыми писателями и читателями и каждый день узнавать что-то новое.