В чем разница между услугами.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>();
}
830   4  

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();
        }
    }
}

теперь два отдельных запросов к этому действию контроллера : First Request

Second Request

обратите внимание, какой из 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/

а это ссылка на официальную документацию :

https://docs.asp.net/en/latest/fundamentals/dependency-injection.html#service-lifetimes-and-registration-options

переходный, ограниченный и одноэлементный определяют процесс создания объекта в 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.

enter image description here

Scoped : - в scoped же экземпляр объекта будет введен в один запрос и ответ.

enter image description here

синглтон : - в Синглтон же объект будет введен через все запрос и ответ. В в этом случае будет создан один глобальный экземпляр объекта.

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

MVC DI image

выше изображение было нарисовано командой SBSS, когда я принимал ASP.NET MVC обучение в Мумбаи обучение, большое спасибо команде SBSS для создания вышеуказанного изображения.

  • Singleton-это один экземпляр для всего времени жизни приложения домен.
  • области один экземпляр для продолжительности определенного запрос, что означает per HTTP запрос в ASP.NET.
  • Transient-это один экземпляр в код запрос.

обычно запрос кода должен быть сделан через параметр конструктора, как в

public MyConsumingClass(IDependency dependency)

Я хотел указать в ответе @akazemis это "службы" в контексте DI не подразумевает RESTful services; службы-Это реализации зависимостей, которые обеспечивают функциональность.

Comments

    Ничего не найдено.