Я хочу реализовать внедрение зависимостей (DI) в ASP.NET Core. Поэтому после добавления этого кода в ConfigureServices
метод оба способа работают.
В чем разница между services.AddTransient
и service.AddScoped
методов в ASP.NET Ядра?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddScoped<IEmailSender, AuthMessageSender>();
}
c#
asp.net-core
.net-core
Эльвин Мамедов
источник
источник
Ответы:
TL; DR
Для большей ясности этот пример из документации ASP.NET показывает разницу:
Чтобы продемонстрировать разницу между этими параметрами времени жизни и регистрации, рассмотрим простой интерфейс, который представляет одну или несколько задач как операцию с уникальным идентификатором
OperationId
. В зависимости от того, как мы настроим время жизни для этой службы, контейнер предоставит запрашивающему классу либо одинаковые, либо разные экземпляры службы. Чтобы было ясно, какое время жизни запрашивается, мы создадим один тип на время жизни:Мы реализуем эти интерфейсы, используя один класс,
Operation
который принимает GUID в своем конструкторе, или использует новый GUID, если ни один не указан:Далее,
ConfigureServices
каждый тип добавляется в контейнер в соответствии с его именованным временем жизни:Обратите внимание, что
IOperationSingletonInstance
служба использует конкретный экземпляр с известным идентификаторомGuid.Empty
, поэтому будет понятно, когда этот тип используется. Мы также зарегистрировали значениеOperationService
, зависящее от каждого из другихOperation
типов, чтобы в запросе было ясно, получает ли эта служба тот же экземпляр, что и контроллер, или новый экземпляр для каждого типа операции. Все, что делает этот сервис, представляет его зависимости как свойства, чтобы они могли отображаться в представлении.Чтобы продемонстрировать время жизни объекта внутри и между отдельными индивидуальными запросами к приложению, образец включает в себя тип,
OperationsController
который запрашивает каждыйIOperation
тип, а также типOperationService
. ЗатемIndex
действие отображает все значения контроллера и службыOperationId
.Теперь к этому действию контроллера подаются два отдельных запроса:
Обратите внимание, какое из
OperationId
значений варьируется в запросе и между запросами.Временные объекты всегда разные; новый экземпляр предоставляется каждому контроллеру и каждой службе.
Объекты области видимости одинаковы в запросе, но различаются в разных запросах
Объекты Singleton одинаковы для каждого объекта и каждого запроса (независимо от того, предоставлен ли экземпляр
ConfigureServices
)источник
В внедрении зависимостей .NET есть три основных срока службы:
Singleton, который создает один экземпляр во всем приложении. Он создает экземпляр в первый раз и повторно использует один и тот же объект во всех вызовах.
Сервисы с ограниченным сроком службы создаются один раз для каждого запроса в рамках области. Это эквивалентно синглтону в текущей области видимости. Например, в MVC он создает один экземпляр для каждого HTTP-запроса, но использует тот же экземпляр в других вызовах в рамках того же веб-запроса.
Временные службы продолжительности жизни создаются каждый раз, когда их запрашивают. Этот срок службы лучше всего подходит для легких служб без сохранения состояния.
Здесь вы можете найти и примеры, чтобы увидеть разницу:
ASP.NET 5 MVC6 Внедрение зависимостей за 6 шагов (ссылка на веб-архив из-за неработающей ссылки)
Ваша инъекция зависимостей готова ASP.NET: ASP.NET 5
А это ссылка на официальную документацию:
Внедрение зависимостей в ASP.NET Core
источник
Transient, scoped и singleton определяют процесс создания объекта в базовом DI ASP.NET MVC, когда необходимо внедрить несколько объектов одного типа. Если вы новичок в внедрении зависимостей, вы можете посмотреть это видео DI IoC .
Вы можете увидеть код контроллера ниже, в котором я запросил два экземпляра «IDal» в конструкторе. Transient, Scoped и Singleton определяют, будет ли один и тот же экземпляр вставлен в «_dal» и «_dal1» или в другое.
Переходный процесс: В переходном режиме новые экземпляры объекта будут внедрены в один запрос и ответ. Ниже приведен снимок, на котором я отображал значения GUID.
Scoped: в Scoped один и тот же экземпляр объекта будет внедрен в один запрос и ответ.
Синглтон: в синглтоне один и тот же объект будет внедрен во все запросы и ответы. В этом случае будет создан один глобальный экземпляр объекта.
Ниже приведена простая диаграмма, которая визуально объясняет вышеизложенное.
Изображение выше было нарисовано командой SBSS, когда я проходил тренинг по ASP.NET MVC в Мумбаи . Большое спасибо команде SBSS за создание вышеуказанного изображения.
источник
new TService
. Scoped будет кэшировать первую его инициализацию для этой «области» (в большинстве случаев HTTP-запрос). Синглтон будет кешировать только один экземпляр за всю жизнь приложения, просто так. Приведенные выше диаграммы настолько запутаны.Обычно запрос кода должен быть сделан через параметр конструктора, как в
Я хотел бы указать в ответе @ akazemis, что «сервисы» в контексте DI не подразумевают сервисы RESTful; сервисы являются реализациями зависимостей, которые обеспечивают функциональность.
источник
AddSingleton ()
AddSingleton () создает один экземпляр службы при первом запросе и повторно использует этот же экземпляр во всех местах, где требуется эта служба.
AddScoped ()
В сервисе с определенной областью, с каждым HTTP-запросом, мы получаем новый экземпляр. Однако в рамках одного и того же HTTP-запроса, если служба требуется в нескольких местах, например, в представлении и в контроллере, один и тот же экземпляр предоставляется для всей области действия этого HTTP-запроса. Но каждый новый HTTP-запрос будет получать новый экземпляр службы.
AddTransient ()
В случае временной службы новый экземпляр предоставляется каждый раз, когда запрашивается экземпляр службы, находится ли он в пределах одного и того же HTTP-запроса или в разных HTTP-запросах.
источник
После поиска ответа на этот вопрос я нашел блестящее объяснение с примером, которым я хотел бы поделиться с вами.
Вы можете посмотреть видео, которое демонстрирует различия ЗДЕСЬ
В этом примере у нас есть этот код:
HomeController
Создать вид
Startup.cs
Скопируйте и вставьте этот код и нажмите кнопку «Создать» в представлении и переключайтесь между ними
AddSingleton
,AddScoped
иAddTransient
каждый раз вы будете получать другой результат, который может помочь вам понять это объяснение:источник
Какой использовать
преходящий
Scoped
одиночка
Используйте Singletons там, где вам нужно поддерживать состояние приложения. Конфигурация приложения или параметры, служба регистрации, кэширование данных - вот некоторые примеры, где вы можете использовать синглтоны.
Внедрение службы с разными временами жизни в другой
источник
Как описано здесь (эта ссылка очень полезна) с примером,
источник
Регистрационные Услуги
Ядро ASP.NET предоставляет следующие 3 метода для регистрации служб в контейнере внедрения зависимостей. Метод, который мы используем, определяет время жизни зарегистрированного сервиса.
AddSingleton () - Как видно из названия, метод AddSingleton () создает службу Singleton. Сервис Singleton создается при первом запросе. Этот же экземпляр затем используется всеми последующими запросами. Таким образом, в общем случае служба Singleton создается только один раз для каждого приложения, и этот единственный экземпляр используется в течение всего срока службы приложения.
AddTransient () - этот метод создает временный сервис. Новый экземпляр временной службы создается каждый раз, когда она запрашивается.
AddScoped () - этот метод создает сервис Scoped. Новый экземпляр службы Scoped создается один раз для каждого запроса в области. Например, в веб-приложении оно создает 1 экземпляр для каждого http-запроса, но использует тот же экземпляр в других вызовах в рамках того же веб-запроса.
источник