07、NetCore2.0依赖注入(DI)之生命周期
07、NetCore2.0依赖注入(DI)之生命周期
NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢?
------------------------------------------------------------------------------------------------------------
写在前面:这是一个系列的文章,总目录请移步:NetCore2.0技术文章目录
------------------------------------------------------------------------------------------------------------
一、生命周期的分类
来看看系统依赖注入框架(DI)的开源代码:
namespace Microsoft.Extensions.DependencyInjection
{
public enum ServiceLifetime
{
Singleton,
Scoped,
Transient
}
}
从源码可以看出,依赖注入框架(DI)支持三种生命周期管理模式
- Singleton
单例模式,服务在第一次请求时被创建,其后的每次请求都沿用这个已创建的服务。我们不用再自己写单例了。
- Scoped
作用域模式,服务在每次请求时被创建,整个请求过程中都贯穿使用这个创建的服务。比如Web页面的一次请求。
- Transient
瞬态模式,服务在每次请求时被创建,它最好被用于轻量级无状态服务。
二、重现三种生命周期的应用场景
首先我们创建三个服务,用来提供GUID。
using System; namespace LifetimeOfDI
{
public interface IGuidService
{
Guid Id();
} public interface ITransientService : IGuidService
{
} public interface IScopedService : IGuidService
{
} public interface ISingletonService : IGuidService
{
} public class GuidServiceBase : IGuidService
{
private readonly Guid _item; public GuidServiceBase()
{
_item = Guid.NewGuid();
} public Guid Id()
{
return _item;
}
} public class TransientService : GuidServiceBase, ITransientService
{
} public class ScopedService : GuidServiceBase, IScopedService
{
} public class SingletonService : GuidServiceBase, ISingletonService
{
}
}
然后用VS2017新建一个Mvc项目,在Startup类中注册这三个服务
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ITransientService, TransientService>();
services.AddScoped<IScopedService, ScopedService>();
services.AddSingleton<ISingletonService, SingletonService>(); services.AddMvc();
}
既然注册了,在Controller中就可以使用这些服务了,我们采取构造函数注入的方式,来给Controller注入这些服务
using Microsoft.AspNetCore.Mvc; namespace LifetimeOfDI.Controllers
{
public class HomeController : Controller
{
private readonly ITransientService _guidTransientService;
private readonly IScopedService _guidScopedService;
private readonly ISingletonService _guidSingletonService; // 构造函数注入
public HomeController(ITransientService guidTransientService,
IScopedService guidScopedService, ISingletonService guidSingletonService)
{
_guidTransientService = guidTransientService;
_guidScopedService = guidScopedService;
_guidSingletonService = guidSingletonService;
} public IActionResult Index()
{
// 传GUID给页面
ViewBag.TransientItem = _guidTransientService.Id();
ViewBag.ScopedItem = _guidScopedService.Id();
ViewBag.SingletonItem = _guidSingletonService.Id(); return View();
}
}
}
在Index.cshtml页面中显示这三个GUID
@{
ViewData["Title"] = "Home Page";
}
<div class="row">
<div>
<h2>Guid Service Shows</h2>
<h3>TransientGuid: @ViewBag.TransientItem</h3>
<h3>ScopedGuid: @ViewBag.ScopedItem</h3>
<h3>SingletonGuid: @ViewBag.SingletonItem</h3>
</div>
</div>
我们启动两个浏览器,可以看出单例模式的Guid在两个浏览器中是一致的,而且,即使刷新浏览器,也不会改变;另外两个生命周期的服务因为每次刷新都发起了一次新的请求,所以Guid都不同。

三、使用局部页面技术验证作用域生命周期的特点
上一节没能验证Scoped类型生命周期,因为每次刷新都发起了一次新的请求。我们需要验证一个Web请求,对服务的多次使用。如何验证呢?这里我们借助局部页面技术。
新建一个局部页面IndexPartial.cshtml,在局部页面中引用我们的自定义服务命名空间,并注入三个服务,分别显示其Id。
@*引用自定义接口的命名空间*@
@using LifetimeOfDI @*依赖注入*@
@inject ITransientService TransientService
@inject IScopedService ScopedService
@inject ISingletonService SingletonService @*输出服务提供的Id*@
<div class="row">
<div>
<h2>Guid Service Shows</h2>
<h3>TransientGuid: @TransientService.Id()</h3>
<h3>ScopedGuid: @ScopedService.Id()</h3>
<h3>SingletonGuid: @SingletonService.Id()</h3>
</div>
</div>
在Index.cshtml页面中两次引用这个局部页,这样就可以展示,一次请求两次调用服务接口的场景。
@{
ViewData["Title"] = "Home Page";
}
@Html.Partial("IndexPartial")
@Html.Partial("IndexPartial")
看看效果吧

从效果看,作用域生命周期内的Id在一次请求的多次调用中保持了一致性;而瞬态生命周期则每次调用都不同;单例生命周期则不用说了,不同请求的多次调用都不变,更不用说相同请求了。
至此,我们理解了三种生命周期的的特点,在业务开发中可以按需使用了。
07、NetCore2.0依赖注入(DI)之生命周期的更多相关文章
- 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理
05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...
- 06、NetCore2.0依赖注入(DI)之整合Autofac
06.NetCore2.0依赖注入(DI)之整合Autofac 除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac.Unity等.只要他们支持 ...
- Asp.Net Core 3.1学习-依赖注入、服务生命周期(6)
1.前言 面向对象设计(OOD)里有一个重要的思想就是依赖倒置原则(DIP),并由该原则牵引出依赖注入(DI).控制反转(IOC)及其容器等概念.在学习Core依赖注入.服务生命周期之前,下面让我们先 ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
- .Net Core3.0依赖注入DI
构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法. 不使用依赖注入 首先,我们创建一个ASP.NET Core Mvc项目, ...
- .netCore2.0 依赖注入
依赖注入(ID)是一种实现对象及其合作者或者依赖想之间松散耦合的技术对于传统的方法来说,获取类的方法通常用new如下 public class DIController : Controller { ...
- 018-019 NET5_内置容器支持依赖注入+IServiceCollection的生命周期
概念: DI依赖注入: IServiceCollection仅支持构造函数注入 什么是依赖注入? 如果对象A依赖对象B,对象B依赖对象C,就可以先构造对象C,然后传递给对象B,再把对象B传递给A.得到 ...
- Console app 里的依赖注入及其实例生命周期
依赖注入是 ASP.NET Core 里的核心概念之一,我们平常总是愉快地在Startup类的ConfigureServices方法里往IServiceCollection里注册各种类型,以致有一些同 ...
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
随机推荐
- C语言第八次博客作业--字符数组
一.PTA实验作业 题目1:查验身份证 1. 本题PTA提交列表 2. 设计思路 定义i,flag=1,z,m[11],a[19] 输入次数n for i=1 to n+1 gets(a) 加权求和在 ...
- JVM学习一:JVM之类加载器概况
18年转眼就3月份都快结束了,也就是说一个季度就结束了:而我也因为年前笔记本坏了,今天刚修好了,那么也应该继续学习和博客之旅了.今年的博客之旅,从JVM开始学起,下面我们就言归正传,进入正题. 一.J ...
- MSIL实用指南-生成索引器
MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item" ...
- npm包使用语义化版本号
npm 采用语义版本管理软件包.所谓语义版本,就是指版本号为a.b.c的形式,其中a是大版本号,b是小版本号,c是补丁号. 一个软件发布的时候,默认就是1.0.0版.如果以后发布补丁,就增加最后一位数 ...
- spring boot — InputStream
@Componentpublic class TextFileDownloadView extends AbstractFileDownloadView { @Override protected I ...
- Spring Boot with Spring-Data-JPA学习案例
0x01 什么是Spring Boot? Spring Boot是用来简化Spring应用初始搭建以及开发过程的全新框架,被认为是Spring MVC的"接班人",和微服务紧密联系 ...
- USACO Humble Numbers
USACO Humble Numbers 这题主要是两种做法,第一种是比较常(jian)规(dan)的-------------用pq(priority_queue)维护,每次取堆中最小值(小根堆) ...
- 爬虫(scrapy--豆瓣TOP250)
# -*- coding: utf-8 -*- import scrapy from douban_top250.items import DoubanTop250Item class MovieSp ...
- 咬碎STL空间配置器
STL空间配置器 一.开场白: 给我的感觉就是,了解是空间配置器的功能,是那么的明了:在看原理,我还是很开心:接下来是360度大转变: 那么长的变量或者函数命名.那么多的宏.不爽,不过,遇上我这种二货 ...
- 我自己总结的C#开发命名规范整理了一份
我自己总结的C#开发命名规范整理了一份 标签: 开发规范文档标准语言 2014-06-27 22:58 3165人阅读 评论(1) 收藏 举报 分类: C#(39) 版权声明:本文为博主原创文章, ...