asp.net core中AddTransient,AddScope和AddSingleton有什么不同?

36人阅读 评论(0) 收藏 举报
分类:

我们先来创建几个接口
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
    {
    }
}

然后在服务中依赖注入上面的接口

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

注意IOperationSingletionInstance和其他的依赖注入不同,它进行了显示实例化。

创建一个服务

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

创建一个控制器
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();
        }
    }
}

两个不同的请求结果

Transient创建的对象总是不同的,每一个服务和每个控制器都创建一个不同的实例。

Scoped创建的对象在同一个请求会话时是相同的,每一个不同的会话创建一个不同的实例。

Singleton创建的对象在所有的地方所有的请求会话创建的都是不同的。

查看评论

asp.net core2.0

-
  • 1970年01月01日 08:00

ASP.NET Core利用原生服务控制反转注入泛型类

在asp.net mvc中,为了减少重复代码,会用到自己写的泛型类,比如IRepository和EfRepository 在Startup.cs中,有几个控制反转例子 ...
  • loongsking
  • loongsking
  • 2017-03-06 15:40:36
  • 1664

ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍

在上一章ASP.NET Core 运行原理解剖[1]:Hosting中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索。而本文则是对上文的一个补充,更加偏向于实...
  • sD7O95O
  • sD7O95O
  • 2017-09-05 07:12:47
  • 64

ASP.NET Core 2.0 依赖注入

问题 如何使用 ASP.NET Core 服务容器进行依赖注入? 答案 创建一个服务 public interface IGreetingService {    string G...
  • sD7O95O
  • sD7O95O
  • 2017-10-27 00:00:00
  • 846

DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection

写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autof...
  • hongjienuan7212
  • hongjienuan7212
  • 2017-10-11 18:08:21
  • 152

asp.net core 对HttpContext 的扩展

现在,试图围绕HttpContext.Current构建你的代码真的不是一个好主意,但是我想如果你正在迁移一个企业类型的应用程序,那么很多HttpContext.Current会围绕这个业务逻辑,它可...
  • MeGoodtoo
  • MeGoodtoo
  • 2017-07-04 15:51:05
  • 1421

ASP.NET Core 认证与授权[5]:初识授权

经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段。在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥...
  • sD7O95O
  • sD7O95O
  • 2017-11-23 00:00:00
  • 623

ASP.NET Core依赖注入解读&使用Autofac替代实现

1. 前言关于IoC模式(控制反转)和DI技术(依赖注入),我们已经见过很多的探讨,这里就不再赘述了。比如说必看的Martin Fowler《IoC 容器和 Dependency Injection ...
  • sD7O95O
  • sD7O95O
  • 2017-09-25 00:00:00
  • 614

ASP.Net Core的内置依赖注入

.Net Core 内置DI ASP.NET Core 的底层设计支持和使用依赖注入。ASP.NET Core 应用程序可以利用内置的框架服务将它们注入到启动类Startup的方法中,并且应...
  • G_Q_L
  • G_Q_L
  • 2017-08-17 17:55:37
  • 1302

单件模式(Singleton创建型)c#简单例子

单件(Singleton创建型模式)c#简单例子 需要生成一个实例时,可采用单件模式 例子中只可生成一个玩家,并对玩家进行测试。单线程例子如下: namespace singletonpattern ...
  • zhgl7688
  • zhgl7688
  • 2014-12-15 23:47:30
  • 1117
    个人资料
    持之以恒
    等级:
    访问量: 33万+
    积分: 5079
    排名: 6877
    最新评论