asp.net core服务的生命周期

ASP.NET Core服务生命周期管理详解 本文深入探讨了ASP.NET Core中服务生命周期的管理,包括瞬态服务、作用域服务和单例服务的区别与应用。通过代码示例展示了如何在处理HTTP请求时正确地解析服务依赖,以及如何通过不同的生命周期设置优化服务的创建和管理。 阅读详情
  • 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中服务生命周期的实践 本文深入探讨了ASP.NET Core中服务生命周期的三个主要模式:瞬态、作用域和单例,通过实例演示了不同生命周期对DataContext实例的影响。文章通过对比不同注册方式下DataContext实例的行为,分析了服务生命周期选择的重要性,并提醒开发者注意避免常见的陷阱,如依赖俘虏。 阅读详情

相关推荐

深入理解ASP.NET Core依赖注入服务生命周期

本文深入探讨ASP.NET Core中服务生命周期的三种类型:瞬态(Transient)、作用域(Scoped)、单例(Singleton),以及如何正确地注册和使用这些生命周期的服务。文章通过实例和代码示例,阐释了服务生命周期对于资源管理和服务行为的重要性,并警示了在服务注册中可能遇到的陷阱,如捕获依赖。最后,讨论了在Program.cs中解析作用域服务的方法,确保资源被正确释放。

weixin_42437253的博客 460

.net core 三种声明周期

每次服务请求都会创建一个对象实例。在这个请求结束之前,这个请求作用域内所有请求都是共用一个实例。每次请求都会创建一个新的对象实例。每次注入也会创建新的对象实例。服务第一次请求时创建对象实例,此后一直沿用。1. 单例(Singleton)3. 瞬时(Transient)2. 作用域(Scoped)

2402_84967919的博客 286

ASP.NET Core中服务生命周期与依赖注入的实践

本文详细探讨了ASP.NET Core中的服务生命周期概念,包括单例、瞬态和作用域服务的创建与应用。通过实例演示如何使用ActivatorUtilities类实例化依赖注入的类,以及如何通过不同的服务生命周期方法解决依赖问题。

weixin_36074800的博客 332

NetCore自带DI容器的三种生命周期浅析

NetCore自带DI容器的三种生命周期浅析 NetCore自带的依赖注入框架,分别由三种生命周期:单例Singleton/瞬时Transient/一次请求Scoped.接下来我将针对这三种生命周期简要的进行使用方法的解析,并不深入,希望各位大佬多多指教。 各生命周期的区别 Singleton:单例,整个程序启动后只存在唯一一份,如同单例模式一样 Transient:瞬时,每一个对象都是不一样的实例 前两者,都是从root容器中获取实例 Scoped:一次请求,即一次Http请求,获取的实例都是同一个,且是

weixin_43872830的博客 4606

ASP.NET Core中的依赖注入与服务生命周期

本文介绍了ASP.NET Core中依赖注入的概念和使用方法,探讨了如何通过依赖注入来替换类型代理模式,以及如何在中间件和端点中声明和使用服务。文章详细阐述了依赖注入在ASP.NET Core中的重要性,包括如何在Startup类中配置服务,以及如何在应用程序的不同部分使用服务。同时,还讨论了服务生命周期的概念,包括单例、瞬态和作用域服务的区别,并展示了如何在实际代码中应用这些概念。

weixin_36151775的博客 466

ASP.NET Core中的服务注册与生命周期管理

本文深入探讨了在ASP.NET Core中如何将服务在容器中多次注册以及如何管理服务的生命周期。通过理解如何注册同一接口的不同实现,我们可以实现更灵活的服务设计。同时,本文还详细介绍了服务生命周期的三种模式:瞬态(Transient)、作用域(Scoped)和单例(Singleton),并结合实例说明了每种生命周期对服务实例化行为的影响。

weixin_35751194的博客 435

.Net Core的服务生命周期

在.NET Core(现在通常称为.NET 5或更高版本中的一部分)中,服务的生命周期是一个重要的概念,它决定了服务的实例如何被创建、管理以及在应用程序中的存在时间

学习和分享 1092

详解.NET Core 依赖注入生命周期

前言 .NET Core 自带依赖注入框架,支持三种不同生命周期的注入模式: Singleton 单例模式 Scoped 区域模式 Transient 瞬时模式 但是常常不知道什么时候使用哪种模式才最合适,接下来我就用代码详细解读一下三种模式 代码示例 首先新建.NET Core API项目来进行代码测试 原创文章 16获赞 12访问量 1万+ 关注

asp.net core 生命周期

作用域生命周期(Scoped Lifecycle):作用域生命周期是在请求生命周期内的一个子生命周期,主要用于管理依赖注入容器中的Scoped服务的生命周期。在请求生命周期中,ASP.NET Core会创建一个用于处理请求的HttpContext实例,并且在整个请求处理过程中,该HttpContext实例会一直被重用。单例生命周期(Singleton Lifecycle):单例生命周期是整个应用程序范围内的生命周期,即在应用程序启动时创建一个实例,并在整个应用程序的生命周期内重用该实例。

qq_41942413的博客 1450

Trae编程工具Cline插件深度集成与Claude 3.7 API Key高级配置实战

本文详细介绍了如何在Trae编程工具中深度集成Cline插件并配置Claude 3.7 API Key的高级技巧。通过实战案例,展示了如何提升代码补全质量、实现多轮对话记忆及自定义代理设置,特别适合全栈工程师和需要私有化AI服务的团队。文章还涵盖了安装流程、API Key获取方式及企业级部署的最佳实践。

weixin_28829903的博客 435

lerobot VLA--SmolVLA代码的讲解

2.图像resize至正方形224x224,图像长宽比不变,其他区域用黑色补充,标记为mask=1,若占位图像(摄像头缺失),则 创建全-1像素的占位图像 标记为mask=0,image为[1, 3, 512, 512],img_mask为True,masks列表长度为2,img_masks为2,因为我这里两个相机。文本嵌入:通过embed_language_tokens() 被转换为嵌入表示,lang_emb 是语言的嵌入,包含了语言的语法和语义信息。1.像素值[0,1]->[-1,1]

caokaifa的博客 4064

ASP.NET Core 中服务生命周期详解:Scoped、Transient 和 Singleton 的业务场景分析

在 ASP.NET Core 中,服务的生命周期直接影响应用的性能和行为。通过依赖注入容器 (ScopedTransient和Singleton。本文将详细阐述这些生命周期的区别及其在实际业务中的应用场景。Scoped: 每次 HTTP 请求创建一个实例,在请求范围内共享。Transient: 每次请求服务时都会创建一个新的实例。Singleton: 应用程序启动时创建一个实例,整个应用生命周期内共享。Scoped:适用于在请求内共享服务的场景。Transient:适用于短生命周期的无状态服务。

dotnet研习社 1963

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置)

本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。

2a4s6d8f0g的博客 563

一图看懂 ASP.NET Core 中的服务生命周期

翻译自 Waqas Anwar 2020年11月8日的文章 《ASP.NET Core Service Lifetimes (Infographic)》 1 ASP.NET Core 支持依赖关系注入(DI)软件设计模式,该模式允许我们注册服务、控制如何实例化这些服务并将其注入到不同的组件中。一些服务可以在短周期内实例化,并且仅在特定的组件和请求中可用;一些实例仅被实例化一次,并在整个应用程序生命周期中可用。这就是 ASP.NET Core 中可用的服务生命周期,共三种,下面我们来分别介绍一下。 Si.

一个 技术“译”民 的『技术译站』,微信公众号:技术译站 696

Linux内存压力测试工具【memtester】详且精

对Linux下的压力测试工具memtester有一个比较人性化的概述,以及避坑心得。

weixin_44118923的博客 1万+

飞牛Docker部署Zerotier后无法访问?三步搞定SSH权限配置!

本文详细解析了在飞牛NAS上通过Docker部署Zerotier后无法访问的常见问题及解决方案。重点介绍了SSH权限配置、tun模块加载和Docker容器权限设置等关键步骤,帮助用户快速解决虚拟网络接口的权限问题,确保Zerotier节点间的正常通信。

qq_27496129的博客 788

ASP.NET Core服务生命周期管理(从入门到精通必看)

掌握ASP.NET Core依赖注入生命周期,精准管理服务实例的创建与释放。详解Singleton、Scoped、Transient三种生命周期适用场景与配置方法,提升应用性能与资源利用率。深入浅出,适合各类项目实践,值得收藏。

SimTrans的博客 991

内网CentOS离线部署LibreOffice:从依赖缺失到服务启动的完整避坑指南

本文详细介绍了在CentOS内网环境中离线部署LibreOffice的完整流程,包括依赖包准备、安装顺序优化及常见报错解决方案。针对金融等封闭网络场景,提供从rpm包选择到服务启动的全套避坑指南,特别解决libXinerama等图形库缺失问题,确保文档转换服务稳定运行。

weixin_33416697的博客 246

ASP.NET Core 依赖注入的三种服务生命周期

依赖注入(Dependency Injection, DI)是一种实现控制反转(Inversion of Control, IoC) 的软件设计模式,也是构建松耦合、可测试、易维护应用程序的核心技术。其核心理念是:不要在类内部创建依赖,而是由外部容器将依赖注入进来。在现代 ASP.NET Core 中内置了强大的 DI 容器,正确使用 DI 的关键在于理解Transient、Scoped 和 Singleton这三种服务生命周期,它们决定了服务实例的创建时机、共享范围与生命周期。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 1323

【ArcGIS Add-in编程】如何创建ArcMap的下拉菜单插件

step1. VS2010中创建一个空的解决方案step2.创建一个项目 直接点击finish。step3 为该项目创建项目,选择Menu,作为根菜单,而后修改xml中的items项,添加需要放在下拉菜单中的项目,例如一个按钮; step4 现在可以创建项目,作为菜单中的项目。为该项目添加新的项目,选择button 此时 xml文件中,多了该button的项目,将该项目添加到items

吃货小跟班的博客 4430

Python爬虫实战:基于Scrapy与Playwright高效爬取人民网新闻数据

本文将详细介绍如何使用Python最新技术栈(Scrapy框架结合Playwright浏览器自动化工具)高效爬取人民网新闻数据。文章包含完整项目搭建、反反爬策略、数据解析存储以及性能优化等核心内容,提供可直接运行的代码示例,适合中高级Python开发者学习现代网络爬虫开发技术。python# 去除特殊空白字符。

2201_76125261的博客 1118

ASP.NET Core托管服务:应用生命周期管理

在现代Web应用开发中,应用的生命周期管理是确保应用稳定运行的关键环节。ASP.NET Core通过其强大的托管服务(Hosted Service)机制,为开发者提供了完整的应用生命周期管理解决方案。本文将深入探讨ASP.NET Core托管服务的核心概念、实现原理以及最佳实践,帮助您构建更加健壮和可靠的应用。 ## 托管服务基础概念 ### 什么是托管服务? 托管服务(Hosted Ser...

gitblog_00157的博客 691

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

(3)ASP.NET Core2.2 DI服务生命周期

ASP.NET Core的依赖注入(DI)提供三种服务生命周期:Transient(每次请求创建新实例,适合无状态服务)、Scoped(同一请求共享实例,适合数据库上下文等)和Singleton(全局共享实例,适合配置服务等)。通过OperationService示例演示了不同生命周期下实例GUID的变化,验证了各生命周期的特性。Scoped适用于请求内共享状态的服务,Transient适合轻量级工具类,Singleton则用于全局共享资源。

wzk153的博客 934

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 查看CentOS上Apache位置,版本,停止,启动
下一篇: Jquery DataTables解决 Cannot reinitialise DataTable 问题
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值