net core体系-web应用程序-4net core2.0大白话带你入门-9asp.net core服务的生命周期
asp.net core服务的生命周期
Transient:每一次GetService都会创建一个新的实例
Scoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
Singleton:整个应用程序生命周期内只创建一个实例
上面描述的比较抽象,不容易理解,用实例来讲解会比较直观。
下面通过具体的例子进行演示。
定义三个空的接口:IArticleService、IProductService、IUserService
然后定义三个实现:ArticleService、ProductService、UserService
1.将接口和实现注入到DI容器
在StartUp类的ConfigureServices方法添加下图代码

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<Test>(Configuration.GetSection("Test")); //演示生命周期
services.AddTransient<IUserService, UserService>();
services.AddScoped<IArticleService, ArticleService>();
services.AddSingleton<IProductService, ProductService>();
}

2.添加私有字段,在测试Controller:LifeTimeController中添加下图代码

private readonly IUserService _userService1;
private readonly IUserService _userService2;
private readonly IArticleService _articleService1;
private readonly IArticleService _articleService2;
private readonly IProductService _productService1;
private readonly IProductService _productService2;

3.添加构造方法

public LifeTimeController(
IUserService userService1, IUserService userService2,
IArticleService articleService1, IArticleService articleService2,
IProductService productService1, IProductService productService2
)
{
_userService1 = userService1;
_userService2 = userService2;
_articleService1 = articleService1;
_articleService2 = articleService2;
_productService1 = productService1;
_productService2 = productService2;
}

4.添加测试代码

public IActionResult Index()
{
var sb = new StringBuilder();
sb.Append("transient1:" + _userService1.GetHashCode() + "<br />");
sb.Append("transient2:" + _userService2.GetHashCode() + "<br />");
sb.Append("scope1:" + _articleService1.GetHashCode() + "<br />");
sb.Append("scope2:" + _articleService2.GetHashCode() + "<br />");
sb.Append("singleton1:" + _productService1.GetHashCode() + "<br />");
sb.Append("singleton2:" + _productService2.GetHashCode() + "<br />"); Response.ContentType = "text/html";
return Content(sb.ToString());
}

5.执行结果
第一次刷新:
transient1:66454027
transient2:35021870
scope1:38350037
scope2:38350037
singleton1:4417230
singleton2:4417230
第二次刷新:
transient1:103653
transient2:5079042
scope1:47546512
scope2:47546512
singleton1:4417230
singleton2:4417230
可见
transient类型的生命周期,每次使用都不一样,不同的类或不同的方法使用都不一样
scope类型的生命周期,在同一个请求内是一样的
singleton类型的生命周期,每次请求都是一样的
所以理解了生命周期的作用,我们在开发的时候就可以根据需要对不同的服务选择不同的生命周期了。
net core体系-web应用程序-4net core2.0大白话带你入门-9asp.net core服务的生命周期的更多相关文章
- net core体系-web应用程序-4net core2.0大白话带你入门-2asp.net core新建项目
新建asp.net core项目 开发环境:Windows Server R2 2008 开发工具:Microsoft Visual Studio 2017 新建asp.net core项目 创建 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-7asp.net core日志组件(Logger和Nlog)
asp.net core日志组件 日志介绍 Logging的使用 1. appsettings.json中Logging的介绍 Logging的配置信息是保存在appsettings.json配置 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-6asp.net core配置文件
asp.net core配置文件 读取配置文件 asp.net core使用appsettings.json代替传统.net framework的web.config中的<appSettin ...
- net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-4asp.net core配置项目访问地址
asp.net core配置访问地址 .net core web程序,默认使用kestrel作为web服务器. 配置Kestrel Urls有四种方式,我这里只介绍一种.其它方式可自行百度. 在Pr ...
- net core体系-web应用程序-4net core2.0大白话带你入门-3asp.net core项目架构和配置文件解读
asp.net core web项目目录解读 Connected Services 和传统.net web项目相比,它的功能类似于添加webservice或者wcf service的引用.暂时用不 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-11asp.net core 2.0 cookie的使用
asp.net core 2.0 cookie的使用 本文假设读者已经了解cookie的概念和作用,并且在传统的.net framework平台上使用过. cookie的使用方法和之前的相比也有所 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-10asp.net core session的使用
asp.net core session的使用 Session介绍 本文假设读者已经了解Session的概念和作用,并且在传统的.net framework平台上使用过. Asp.net core ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
随机推荐
- 常见的SQL调优(SQL Tuning)Tips
建立适当的索引(参考<正确建立数据库索引的姿势>) 用UNION替换OR (适用于索引列) 用exist.not exist代替 in.not in 不要以字符格式声明数字(会 ...
- 手把手教你React Native 实战之开山篇《一》
先说一下我为什么学习RN 18年3月29号,随着自己内心的欲望和冲动,任务交接了一下,正式离开一家医疗公司.第二天就入职了这之前已经找好的公司,由于自己对代码浓厚的热情,自己终于也不再带团队.正好有充 ...
- Confluence 6 使用 Apache 的 mod_jk
在 Confluence 6 及其后续版本中,不能使用 mod_jk 来做代理.这是因为 Synchrony 服务导致的这个限制. Synchrony 在协同编辑的时候需要启动,同时还不能接受 A ...
- opencv 图像矫正
四个坐标系的转换:https://blog.csdn.net/humanking7/article/details/44756073 标定和矫正:https://blog.csdn.net/u0134 ...
- vue 中axios 的基本配置和基本概念
axios的基本概念及安装配置方法 ajax:异步请求,是一种无需再重新加载整个网页的情况下,能够更新部分网页的技术 axios:用于浏览器和node.js的基于promise的HTTP客户端 a ...
- js获取url参数值,并解决中文乱码
<script type="text/javascript"> function GetQueryString(name) { var reg = new RegExp ...
- Android 基础 二 四大组件 Activity
Activity Intent IntentFilter 一理论概述 一. Activity 用来提供一个能让用户操作并与之交互的界面. 1.1 启动 startActivity(Intent int ...
- 【mysql】编码问题
原始数据是unicode,存入数据库.需要注意的几个地方: 1.建立数据库时,选择编码方式为utf8 -- UTF-8 Unicode 2.代码中建立数据库连接时,选择charset=utf8 3.存 ...
- Spring JDBC概述
1.jdbc 概述 Spring JDBC是Spring框架的持久层子框架.用于对数据库的操作(增删改查). 而JdbcTemplate它是spring jdbc子框架中提供的一个操作类,用于对原始J ...
- postMan测试https接口
一.如何安装postman? Postman下载地址https://www.getpostman.com/ 我下载的版本是Postman-win64-5.0.0-Setup.exe 这是免安装的,可以 ...