Срок службы

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

Transient

Служба с временным временем существования создается каждый раз, когда она запрашивается из контейнера службы. Чтобы зарегистрировать сервис как временный, вызовите AddTransient.

В приложениях, обрабатывающих запросы, временные службы удаляются в конце запроса. Это время существования вызывает выделение по запросу, так как службы разрешаются и создаются каждый раз. Дополнительные сведения см. в руководстве по IDisposable для временных и общих экземпляров.

Сфокусированные

Для веб-приложений время существования с ограниченной областью видимости означает, что службы создаются один раз на каждый запрос клиента (подключение). В приложениях, обрабатывающих запросы, службы с заданной областью удаляются в конце запроса. Зарегистрируйте службы с областью действия путем вызова AddScoped.

Замечание

При использовании Entity Framework Core метод расширения AddDbContext по умолчанию регистрирует типы DbContext с заданной областью времени существования.

Служба с заданной областью всегда должна использоваться в пределах области — неявной области (например, для каждого запроса в ASP.NET Core) или явной области, созданной с помощью IServiceScopeFactory.CreateScope().

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

При создании и использовании явной области с IServiceScopeFactory разрешается разрешать скоуп-службу в рамках синглтона.

Также допустимо:

  • Разрешение одноэлементной службы из службы с заданной областью или временной службы.
  • Разрешите службу с заданной областью из другой службы с заданной областью или временной службой.

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

Singleton

Службы с временем существования singleton создаются в следующих случаях.

  • При первом запросе.
  • Разработчиком при предоставлении экземпляра реализации непосредственно в контейнер. Этот подход требуется достаточно редко.

Каждый последующий запрос на реализацию службы из контейнера внедрения зависимостей использует тот же экземпляр. Если в приложении нужно использовать одноэлементные службы, разрешите контейнеру служб управлять временем их существования. Не реализуйте одноэлементный подход и предоставьте код для удаления одноэлементных объектов. Услуги ни в коем случае не должны утилизироваться кодом, который извлек их из контейнера. Если тип или фабрика зарегистрированы как одноэлементный объект, контейнер автоматически удаляет одноэлементный объект.

Зарегистрируйте синглтон-сервисы с помощью AddSingleton. Одноэлементные службы должны быть потокобезопасными и часто использоваться в бессостояточных службах.

В приложениях, обрабатывающих запросы, синглтон-сервисы удаляются, когда ServiceProvider освобождается по завершении работы приложения. Так как память не освобождается до завершения работы приложения, рассмотрите возможность использования памяти с одной службой.