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类型的生命周期,每次请求都是一样的

所以理解了生命周期的作用,我们在开发的时候就可以根据需要对不同的服务选择不同的生命周期了。

asp.net core服务的生命周期的更多相关文章

  1. net core体系-web应用程序-4net core2.0大白话带你入门-9asp.net core服务的生命周期

    asp.net core服务的生命周期   Transient:每一次GetService都会创建一个新的实例 Scoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request ...

  2. 实战Asp.Net Core:DI生命周期

    title: 实战Asp.Net Core:DI生命周期 date: 2018-11-30 21:54:52 --- 1.前言 Asp.Net Core 默认支持 DI(依赖注入) 软件设计模式,那使 ...

  3. .net core 服务注册生命周期

    在Asp.Net core中的IServiceCollection容器中注册服务的生命周期分以下3种: 1.Transient 通过AddTransient注册,会在IServiceCollectio ...

  4. Asp.Net Core中服务的生命周期选项区别和用法

    在做一个小的Demo中,在一个界面上两次调用视图组件,并且在视图组件中都调用了数据库查询,结果发现,一直报错,将两个视图组件的调用分离,单独进行,却又是正常的,寻找一番,发现是配置依赖注入服务时,对于 ...

  5. (3)ASP.NET Core 服务生命周期

    1.前言 在ConfigureServices方法中的容器注册每个应用程序的服务,Asp.Core都可以为每个应用程序提供三种服务生命周期:●Transient(暂时):每次请求都会创建一个新的实例. ...

  6. 2、ASP.NET Core中服务的生命周期

    ASP.NET Core支持依赖注入软件设计模式,它允许在不同的组件中注入我们的服务,并且控制服务的初始化.有些服务可以在短时间内初始化,并且只能在某个特别的组件,以及请求中才能用到:而还有一些服务, ...

  7. (转)教你记住ASP.NET WebForm页面的生命周期

    对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...

  8. 教你记住ASP.NET WebForm页面的生命周期

    对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...

  9. ASP.NET 应用程序(Application)生命周期概述

    原文:ASP.NET 应用程序(Application)生命周期概述 引用MSDN:ASP.NET 应用程序生命周期概述 本 主题概述应用程序生命周期,列出重要的生命周期事件,并描述如何编写适合应用程 ...

随机推荐

  1. webstorm常用功能FTP,及常用快捷键

    常用的FTP功能截图如下: 打开配置窗口 常用配置选项,填好FTP登录信息后点 Test FTP 测试一下,(测试之前,这里选“被动模式”) 默认选哪个FTP上传 注意这里的路径是开发后的上传和访问路 ...

  2. Grooming Meeting及测试人员所扮演的角色

    Grooming Meeting的中文翻译是“梳理会议”,它并不是Scrum框架中标准的会议(标准会议为Planning Meeting, Daily Scrum Meeting, Review Me ...

  3. IPv4套接字地址结构

    一.IPv4套接字地址结构(POSIX定义) (1)长度字段sin_len是为增加对OSI协议的支持而随4.3BSD-Reno添加的:并不是所有的厂家都支持套接字地址结构的长度字段,而且POSIX规范 ...

  4. DCNN models

    r egion based RNN Fast RCNN Faster RCNN F-RCN Faster RCNN the first five layers is same as the ZF ne ...

  5. android 不同Activity之间数据传递

    1. 传值Activity package mydemo.mycom.demo2; import android.content.Intent; import android.support.v7.a ...

  6. C# 对图片加水印

    using System; using System.Collections; using System.Data; using System.Linq; using System.Web; usin ...

  7. 第14月第23天 uitextfield文字下移

    1. http://www.jianshu.com/p/641a0cbcabb0

  8. python - 上下文管理协议(with + __enter__ + __exit__)

    上下文管理协议: with + __enter__ + __exit__ #上下问管理协议: #with + __enter__ + __exit__ class Test(): def __init ...

  9. SpringMVC——SpringMVC简介

    Spring web mvc 和Struts2 都属于表现层的框架,它是Spring 框架的一部分,我们可以从Spring 的整体结构中看得出来:

  10. AD域相关的属性和C#操作AD域

     “常规”标签  姓 Sn 名 Givename 英文缩写 Initials 显示名称 displayName 描述 Description 办公室 physicalDeliveryOfficeNam ...