当前位置: 首页 > 知识库问答 >
问题:

AddTransion、AddScoped和AddSingleton服务差异

松景铄
2023-03-14
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddScoped<IEmailSender, AuthMessageSender>();
}

共有1个答案

白成济
2023-03-14

DR

瞬态对象总是不同的;为每个控制器和每个服务提供一个新实例。

作用域对象在请求中是相同的,但在不同的请求中是不同的。

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
    {
    }
}
using System;
using DependencyInjectionSample.Interfaces;
namespace DependencyInjectionSample.Classes
{
    public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance
    {
        Guid _guid;
        public Operation() : this(Guid.NewGuid())
        {

        }

        public Operation(Guid guid)
        {
            _guid = guid;
        }

        public Guid OperationId => _guid;
    }
}

接下来,在configureReservices中,每个类型都根据其命名的生存期添加到容器中:

services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
services.AddTransient<OperationService, OperationService>();

请注意,IOOperationSingletonInstance服务正在使用一个已知ID为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以及一个Operation类型,它请求每种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值在请求内和请求之间的变化。

>

  • 瞬态对象总是不同的;为每个控制器和每个服务提供一个新实例。

  •  类似资料:
    • 本文向大家介绍什么是AddSingleton,AddScoped,Add Transient C#Asp.net Core?,包括了什么是AddSingleton,AddScoped,Add Transient C#Asp.net Core?的使用技巧和注意事项,需要的朋友参考一下 有三种方法可以在Startup.cs中注册依赖项。即AddSingleton,AddScoped和AddTransi

    • 这肯定不是REST,因为它不是无状态的。它考虑到cookies并有自己的会话。 是RPC吗?RPC和REST有什么区别?

    • 我们如何将下面的代码转换为工厂而不是服务 在这两个方面,工厂和服务的更好实施方式是什么,请提出建议。我是AngularJs的新手,所以请帮我解决这个问题

    • 本文向大家介绍面向连接的服务和无连接的服务之间的差异。,包括了面向连接的服务和无连接的服务之间的差异。的使用技巧和注意事项,需要的朋友参考一下 这些服务都用于在两个或多个设备之间建立连接。这些服务是网络层的一部分。 面向连接的服务 面向连接的服务就像电话系统。它以建立连接开始,以连接终止结束。该服务使用握手方法在发送方和接收方之间建立连接。 无连接服务 面向连接的服务就像一个邮政系统。它不必建立连

    • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 有人能给我解释一下JVM、服务器\ JVM之间的区别吗。dll文件和Java HotSpot VM。我已经学习过了 jvm.dlljava.exe、javaw.exe和jvm.dll之间的差异 JVM和热点的区别是什么? “java-服务器”和“java-客户端”之间的真正区别? http://www.oracle.com/tec

    • 我想从控制器和服务层测试相同的方法。问题是:为什么我必须在控制器中使用注释,为什么不为使用注释。对于服务,同样的问题是,为什么我需要存储库,为什么不使用?你能告诉我这两者的区别吗? 这里是控制器: 这里是服务类: 服务测试: 控制器测试: