C# 服务生命周期:Singleton、Scoped、Transient

文章目录

  • 1、概念:服务生命周期
    • 单例 (Singleton) :
    • 作用域 (Scoped) :
    • 瞬态 (Transient) :
  • 2、对 Scoped 和 Transient 进一步辨析
    • Scoped 生命周期
    • Transient 生命周期
    • 选择哪种生命周期

1、概念:服务生命周期

单例 (Singleton) :

整个应用程序生命周期中只有一个实例被创建并共享。
如果你在依赖注入容器中将 AsyncPeriodicBackgroundWorkerBase 的实现注册为单例,那么这个任务将会是单例的。

作用域 (Scoped) :

每个请求一个新实例,通常在 Web 应用中使用。
如果你将它注册为作用域服务,每个作用域(例如 HTTP 请求)中会创建一个新的实例。

瞬态 (Transient) :

每次请求时都会创建一个新的实例。
如果注册为瞬态服务,每次获取该服务时都会得到一个新的实例。
如何确定任务是否为单例
假设你是在使用 ASP.NET Core 或类似的依赖注入框架,你可以通过如下方式注册到服务中来决定生命周期:

public void ConfigureServices(IServiceCollection services)
{
    // 将该任务注册为单例
    services.AddSingleton<MyBackgroundWorker>();
    
    // 或者作为一个作用域实例
    // services.AddScoped<MyBackgroundWorker>();

    // 或者作为一个瞬态实例
    // services.AddTransient<MyBackgroundWorker>();
}

2、对 Scoped 和 Transient 进一步辨析

在后端服务中(例如使用 ASP.NET Core 的应用程序),Scoped 和 Transient 是两种常用的服务生命周期管理方式,它们定义了服务实例的创建和使用方式。了解它们之间的区别对于选择合适的服务生命周期管理有重要意义:

Scoped 生命周期

Scoped 服务在每个请求(或作用域,一个会话内)中被创建一次。一个请求期间同一服务的所有请求将获得相同的实例。

  • 使用场景 :
    通常用于 Web 应用程序中,作用域服务在每个 HTTP 请求的开始时创建,并在请求结束时释放。这种方式适合那些需要在同一请求上下文共享数据的情况下使用。
    例如,通常数据库上下文(DbContext)就会被注册为 Scoped 以保证一个请求使用同一个数据库连接。

  • 适用性 :
    不适用于非 Web 场景或者后台服务中没有请求界限的情况下使用。

Transient 生命周期

Transient 服务在每次请求它们的时候都会创建一个新的实例。即,每次获取服务都会得到一个新的实例。

  • 使用场景 :
    适用于轻量级无状态的服务,比如:工具类、转换器等,每次使用都需要新的实例,而不需要在不同请求或调用之间保持状态。
    优化系统内存开销,保证服务独占其状态。
  • 适用性 :
    适用于多种类型的应用场景,不受限于请求或作用域的边界。
    因为它是每次请求创建新实例,所以使用时需要注意控制实例构造成本,以减少性能消耗。

选择哪种生命周期

Scoped :使用 Scoped 主要是针对应用的请求/会话生命周期,适合单请求内的数据一致性场景。
Transient :使用 Transient 主要是为了实现无状态的轻量级服务,每次都可创建独立实例的使用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度 一&#xff0c; PWM实现原理二&#xff0c;软件实现三&#xff0c;正点原子裸机开发总结 一&#xff0c; PWM实现原理 PWM和学习51时候基本上一致&#xff0c;控制频率&#xff08;周期&#xff09;和占空比&#xff0c;51实验…

Java 性能监控工具详解:JConsole、VisualVM 和 Java Mission Control

在 Java 应用程序的开发和维护过程中&#xff0c;性能监控和故障诊断是至关重要的。本文将详细介绍三款常用的 Java 性能监控工具&#xff1a;JConsole、VisualVM 和 Java Mission Control&#xff08;JMC&#xff09;&#xff0c;并探讨它们的功能和使用方法。 1 JConsole 1…

一款好用的书签管理工具

多平台同步&#xff1a;可以在网页端、手机&#xff08;iOS 和 Android&#xff09;端同步使用。无论你是在电脑上浏览网页添加书签&#xff0c;还是在外出时使用手机&#xff0c;都能方便地访问和管理书签。例如&#xff0c;你在办公室电脑上收藏了一篇关于行业研究的网页&…

ansible-api分析(Inventory)

一. 简述&#xff1a; 通过ansible 实现系统初始化功能&#xff0c; 为和平台嵌入&#xff0c; 需要通过ansible的api进行功能实现。 准确来说&#xff0c;ansible并没有纯粹的外部接入api功能&#xff0c; 只是官方提供了原生类&#xff0c;用于继承接入&#xff0c;从而实现a…

智元机器人千台量产,开启具身智能新纪元

近日&#xff0c;智元机器人正式官宣一则重磅消息&#xff1a;其第 1000 台通用具身机器人成功下线&#xff0c;这无疑在科技领域投下了一颗震撼弹&#xff0c;引发行业内外的广泛关注。 这千台下线的机器人中&#xff0c;涵盖 731 台双足人形机器人&#xff0c;如远征 A2、灵…

ROS2 跨机话题通信问题(同一个校园网账号)

文章目录 写在前面的话校园网模式&#xff08;失败&#xff09;手机热点模式&#xff08;成功&#xff09; 我的实验细节实验验证1、ssh 用户名IP地址 终端控制2、互相 ping 通 IP3、ros2 run turtlesim turtlesim_node/turtle_teleop_key4、ros2 multicast send/receive5、从机…

SUB输入5V升压充电16.8V芯片HU5912

HU5912芯片&#xff0c;作为航誉微电子有限公司推出的一款高性能升压充电管理IC&#xff0c;自其面世以来&#xff0c;便以其出色的性能和广泛的应用领域&#xff0c;受到了业界的高度关注和赞誉。本文将详细介绍HU5912芯片的技术特点、应用优势、市场定位以及其在各类电子设备…

导出中心设计

业务背景 应用业务经常需要导出数据&#xff0c;但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败&#xff1b;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心&#xff0c;将导出的条数加以限制&#xf…

构建智能企业:中关村科金大模型企业知识库的技术解析与应用

在数字化转型的浪潮中&#xff0c;企业对智能化知识管理的需求日益增长。知识作为企业的核心资产&#xff0c;其高效管理和应用对于提升企业运营效率和决策质量至关重要。中关村科金大模型企业知识库凭借其强大的技术架构和广泛的应用场景&#xff0c;成为构建智能企业的重要工…

多线程访问FFmpegFrameGrabber.start方法阻塞问题

一、背景 项目集成网络摄像头实现直播功能需要用到ffmpeg处理rtmp视频流进行web端播放 通过网上资源找到大神的springboot项目实现了rtmp视频流转为http请求进行视频中转功能&#xff0c;其底层利用javacv的FFmpegFrameGrabber进行拉流、推流&#xff0c;进而实现了视频中转。 …

C++11——2:可变模板参数

一.前言 C11引入了可变模板参数&#xff08;variadic template parameters&#xff09;的概念&#xff0c;它允许我们在模板定义中使用可变数量的参数。这样&#xff0c;我们就可以处理任意数量的参数&#xff0c;而不仅限于固定数量的参数。 二.可变模板参数 我们早在C语言…

ENSP综合实验(中小型网络)

一、实验背景 在当今数字化的企业环境中&#xff0c;一个稳定、高效且安全的网络架构对于业务的持续运营和发展至关重要。随着企业内部各部门业务的不断拓展&#xff0c;如财务部门对数据保密性要求极高&#xff0c;访客区域的网络接入需求逐渐增多&#xff0c;以及对外提供特定…

nvidia控制面板找不到怎么回事?这有解决方法!

NVIDIA控制面板是一款用于管理和调整NVIDIA显卡的软件&#xff0c;它可以让你优化游戏和图形应用程序的性能和画质&#xff0c;以及设置多显示器、音视频、CUDA等功能。但是&#xff0c;有时候你可能会发现你的电脑上找不到NVIDIA控制面板&#xff0c;这可能是由于以下原因造成…

在Vue3项目中使用svg-sprite-loader

1.普通的svg图片使用方式 1.1 路径引入 正常我们会把项目中的静态资源放在指定的一个目录&#xff0c;例如assets,使用起来就像 <img src"../assets/svgicons/about.svg" /> 1.2封装组件使用 显然上面的这种方法在项目开发中不太适用&#xff0c;每次都需…

html+css+js网页设计 美食 美食3个页面(带js)

htmlcssjs网页设计 美食 美食3个页面(带js) 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&…

【235. 二叉搜索树的最近公共祖先 中等】

题目&#xff1a; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一…

Visual Studio C++使用笔记

个人学习笔记 右侧项目不显示 CTRL ALT L 创建第一个项目 添加类&#xff08;头文件、CPP文件&#xff09;

【Shell脚本】Docker构建Java项目,并自动停止原镜像容器,发布新版本

本文简述 经常使用docker部署SpringBoot 项目&#xff0c;因为自己的服务器小且项目简单&#xff0c;因此没有使用自动化部署。每次将jar包传到服务器后&#xff0c;需要手动构建&#xff0c;然后停止原有容器&#xff0c;并使用新的镜像启动&#xff0c;介于AI时代越来越懒的…

vulhubn中potato靶场

IP和端口探测 80端口是一个图片 7120端口是这个 使用 hydra爆破密码 使用ssh远程登录 执行exp提权到root成功&#xff0c;找到Flag&#xff01;

复杂园区网基本分支的构建

目录 1、各主机进行网络配置。2、交换机配置。3、配置路由交换&#xff0c;进行测试。4、配置路由器接口和静态路由&#xff0c;进行测试。5、最后测试任意两台主机通信情况 模拟环境链接 拓扑结构 说明&#xff1a; VLAN标签在上面的一定是GigabitEthernet接口的&#xff0c…