В чем разница между услугами.AddTransient, сервис.AddScoped и сервис.AddSingleton методы в ASP.NET ядро?
Я хочу реализовать инъекции зависимостей in Asp.Net ядро. Поэтому после добавления этого кода в ConfigureServices метод, оба способа работают.
в чем разница между услуги.AddTransient и сервис.AddScope методы есть Asp.Net ядро?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddScoped<IEmailSender, AuthMessageSender>();
}
4 ответов:
для получения дополнительных разъяснений, этот пример из asp.net docs показывает разницу :
чтобы продемонстрировать разницу между этими жизни и варианты оформления, рассмотрим простой интерфейс, который представляет одну или несколько задач, как работа с уникальным идентификатором
OperationId. В зависимости от того, как мы настраиваем время жизни для этой службы, контейнер будет предоставлять один и тот же или разные экземпляры службы запрашивающему классу. Сделать его ясно, какой срок службы запрашивается, мы создадим один тип на время жизни вариант:using System; namespace DependencyInjectionSample.Interfaces { public interface IOperation { Guid OperationId { get; } } public interface IOperationTransient : IOperation { } public interface IOperationScoped : IOperation { } public interface IOperationSingleton : IOperation { } public interface IOperationSingletonInstance : IOperation { } }мы реализуем эти интерфейсы с помощью одного класса,
Operation, который принимаетGuidв своем конструкторе, или использует новыйGuidесли ее нет.далее
ConfigureServices, каждый тип добавляется в контейнер в соответствии с его именованным временем жизни:services.AddTransient<IOperationTransient, Operation>(); services.AddScoped<IOperationScoped, Operation>(); services.AddSingleton<IOperationSingleton, Operation>(); services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty)); services.AddTransient<OperationService, OperationService>();отметим, что
IOperationSingletonInstanceсервис использует конкретный экземпляр с известным идентификаторомGuid.Emptyтак это будет ясно, когда этот тип используется. Мы также зарегистрировалиOperationServiceэто зависит от каждого из другихOperationтипы, чтобы в запросе было ясно, получает ли эта служба тот же экземпляр, что и контроллер, или новый для каждого типа операции. Все, что делает эта служба, - это предоставляет свои зависимости как свойства, чтобы они могли отображаться в представлении.using DependencyInjectionSample.Interfaces; namespace DependencyInjectionSample.Services { public class OperationService { public IOperationTransient TransientOperation { get; } public IOperationScoped ScopedOperation { get; } public IOperationSingleton SingletonOperation { get; } public IOperationSingletonInstance SingletonInstanceOperation { get; } public OperationService(IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationSingletonInstance instanceOperation) { TransientOperation = transientOperation; ScopedOperation = scopedOperation; SingletonOperation = singletonOperation; SingletonInstanceOperation = instanceOperation; } } }для демонстрации времени жизни объекта внутри и между отдельными индивидуальными запросами к приложение, образец включает в себя
OperationsControllerчто запрашивает каждый видIOperationтип, а такжеOperationService. ЭлементIndexдействие затем отображает все контроллеры и службыOperationIdзначения.using DependencyInjectionSample.Interfaces; using DependencyInjectionSample.Services; using Microsoft.AspNetCore.Mvc; namespace DependencyInjectionSample.Controllers { public class OperationsController : Controller { private readonly OperationService _operationService; private readonly IOperationTransient _transientOperation; private readonly IOperationScoped _scopedOperation; private readonly IOperationSingleton _singletonOperation; private readonly IOperationSingletonInstance _singletonInstanceOperation; public OperationsController(OperationService operationService, IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationSingletonInstance singletonInstanceOperation) { _operationService = operationService; _transientOperation = transientOperation; _scopedOperation = scopedOperation; _singletonOperation = singletonOperation; _singletonInstanceOperation = singletonInstanceOperation; } public IActionResult Index() { // viewbag contains controller-requested services ViewBag.Transient = _transientOperation; ViewBag.Scoped = _scopedOperation; ViewBag.Singleton = _singletonOperation; ViewBag.SingletonInstance = _singletonInstanceOperation; // operation service has its own requested services ViewBag.Service = _operationService; return View(); } } }теперь два отдельных запросов к этому действию контроллера :
обратите внимание, какой из
OperationIdзначения варьируются в пределах запроса и между запросы.
переходные объекты всегда разные; новый экземпляр предоставляется каждому контроллеру и каждой службе.
объекты с областью действия одинаковы в пределах запроса, но различны в разных запросах
одноэлементные объекты одинаковы для каждого объекта и каждого запроса (независимо от того, предоставляется ли экземпляр в
ConfigureServices)
в инъекции зависимости dotnet есть 3 основных времени жизни:
Синглтон который создает один экземпляр во всем приложении. Он создает экземпляр в первый раз и повторно использует один и тот же объект во всех вызовах.
Scoped пожизненные службы создаются один раз на запрос в пределах области. Он эквивалентен Синглтону в текущей области видимости. например. в MVC он создает 1 экземпляр на каждый http-запрос, но использует то же самое экземпляр в других вызовах в пределах того же веб-запроса.
транзиторная услуги жизни создаются каждый раз, когда они просят. Этот срок службы лучше всего подходит для легких служб без состояния.
здесь вы можете найти и примеры, чтобы увидеть разницу :
http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/
https://codewala.net/2015/04/30/your-dependency-injection-ready-asp-net-asp-net-5/
а это ссылка на официальную документацию :
переходный, ограниченный и одноэлементный определяют процесс создания объекта в ASP.NET MVC core DI, когда необходимо ввести несколько объектов одного типа. Если вы новичок в инъекции зависимостей, вы можете увидеть это DI IOC video
вы можете увидеть ниже код контроллера, в котором я запросил два экземпляра "IDal" в конструкторе. Переходный, область действия и Синглтон определяют, будет ли один и тот же экземпляр вводиться в "_dal" и "_dal1" или отличающийся.
public class CustomerController : Controller { IDal dal = null; public CustomerController(IDal _dal ,IDal _dal1) { dal = _dal; // DI of MVC core // inversion of control } }переходный: - в переходных новые экземпляры объекта будут введены в один запрос и ответ. Ниже приведен снимок изображения, где я отображал значения GUID.
Scoped : - в scoped же экземпляр объекта будет введен в один запрос и ответ.
синглтон : - в Синглтон же объект будет введен через все запрос и ответ. В в этом случае будет создан один глобальный экземпляр объекта.
Ниже приведена простая диаграмма, которая объясняет вышеуказанный фундаментальный визуально.
выше изображение было нарисовано командой SBSS, когда я принимал ASP.NET MVC обучение в Мумбаи обучение, большое спасибо команде SBSS для создания вышеуказанного изображения.
- Singleton-это один экземпляр для всего времени жизни приложения домен.
- области один экземпляр для продолжительности определенного запрос, что означает per HTTP запрос в ASP.NET.
- Transient-это один экземпляр в код запрос.
обычно запрос кода должен быть сделан через параметр конструктора, как в
public MyConsumingClass(IDependency dependency)Я хотел указать в ответе @akazemis это "службы" в контексте DI не подразумевает RESTful services; службы-Это реализации зависимостей, которые обеспечивают функциональность.





Comments