c# 依赖注入-服务的生命周期

在 C# 中,依赖注入服务的生命周期指的是在应用程序中管理和控制依赖项注入服务对象的生命周期的方式。常见的生命周期包括瞬态(transient)、作用域(scoped)和单例(singleton)三种。

  1. 瞬态(Transient)生命周期
    瞬态生命周期是指每次从容器中请求服务时,都会创建一个新的实例。这意味着每次注入服务时都会得到一个新的对象,对象的生命周期仅在请求期间。适用于每次都需要新实例的场景。
  • 应用场景:适用于需要频繁创建新实例的服务。每次请求时都会创建一个新的-对象,对象的生命周期仅限于当前请求或方法调用。
  • 示例:适合轻量级临时对象或者对象内部状态随请求变化的情况。例如,一些计算服务或者临时数据处理服务。
services.AddTransient<IService, Service>();
  1. 作用域(Scoped)生命周期:
    作用域生命周期是指在同一个作用域中,每次请求服务都会得到相同的实例,而不同作用域之间会有不同的实例。通常在每个 HTTP 请求或每个线程上下文中会创建一个新的作用域,服务的生命周期为整个作用域。适用于需要在同一个作用域内共享服务实例的场景。
  • 应用场景:适用于需要在同一个作用域内共享实例的服务。通常在 Web 应用中,每个 HTTP 请求会创建一个作用域,该作用域内的服务实例在整个请求过程中都是同一个。
  • 示例:在处理每个 HTTP 请求时,例如数据库上下文或者用户身份验证服务,保证在同一请求中使用相同的实例以确保数据一致性和请求隔离。
services.AddScoped<IService, Service>();
  1. 单例(Singleton)生命周期
    单例生命周期是指在整个应用程序生命周期中只会创建一个实例,所有请求都会共享同一个实例。适用于整个应用程序生命周期内只需要一个实例的场景。
  • 应用场景:适用于整个应用程序生命周期内只需要一个实例的服务。这样可以确保所有请求共享同一个实例,节省资源并确保全局状态一致性。
  • 示例:例如配置管理服务、日志服务或者缓存服务,这些服务在应用程序运行期间始终保持不变,并且需要在应用程序的各个部分共享相同的实例。
services.AddSingleton<IService, Service>();

使用示例

using Microsoft.Extensions.DependencyInjection;
using System;namespace IOCTest
{internal class Program{static void Main(string[] args){//SingletionServiceTest();//TransientServiceTest();ScoreServiceTest();Console.ReadKey();}private static void ScoreServiceTest(){ServiceCollection services = new ServiceCollection();services.AddScoped<TestServicelmpl>();TestServicelmpl tt;using (ServiceProvider sp = services.BuildServiceProvider()){using (IServiceScope scope1 = sp.CreateScope()){TestServicelmpl testServicelmpl = scope1.ServiceProvider.GetService<TestServicelmpl>();TestServicelmpl testServicelmpl2 = scope1.ServiceProvider.GetService<TestServicelmpl>();testServicelmpl.Name = "ouou";bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);tt = testServicelmpl;}using (IServiceScope scope2 = sp.CreateScope()){TestServicelmpl testServicelmpl = scope2.ServiceProvider.GetService<TestServicelmpl>();TestServicelmpl testServicelmpl2 = scope2.ServiceProvider.GetService<TestServicelmpl>();testServicelmpl.Name = "kk";bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);isEqual = ReferenceEquals(testServicelmpl, tt);}}}static void SingletionServiceTest(){ServiceCollection services = new ServiceCollection();services.AddSingleton<TestServicelmpl>();using (ServiceProvider sp = services.BuildServiceProvider()){TestServicelmpl testServicelmpl = sp.GetService<TestServicelmpl>();TestServicelmpl testServicelmpl2 = sp.GetService<TestServicelmpl>();bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);testServicelmpl.Name = "ouou";testServicelmpl.SayHi();testServicelmpl.Name = "kk";testServicelmpl2.SayHi();}}static void TransientServiceTest(){ServiceCollection services = new ServiceCollection();services.AddTransient<TestServicelmpl>();using (ServiceProvider sp = services.BuildServiceProvider()){TestServicelmpl testServicelmpl = sp.GetService<TestServicelmpl>();TestServicelmpl testServicelmpl2 = sp.GetService<TestServicelmpl>();bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);testServicelmpl.Name = "ouou";testServicelmpl.SayHi();testServicelmpl.Name = "kk";testServicelmpl2.SayHi();}}}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【postgresql】pg_dump备份数据库

pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件&#xff0c;以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host&#xff1a;指定数据库服务器的主…

2024年大数据高频面试题(上篇)

文章目录 HDFS读流程和写流程HDFS读数据流程NameNode和Secondary NameNode工作机制FsimageEdits文件Seen_txidnamenode工作机制HA NameNode如何工作ZKFCHealthMonitorActiveStandbyElectorJouranlNode集群DataNode工作机制DataNode数据损坏压缩MapReduce工作流程MapTask工作流R…

Visual Studio远程调试工具

路径&#xff1a;Visual Studio安装路径/Common7/IDE/Remote Debugger/平台/msvsmon.exe。 平台有x86、x64&#xff0c;x64即可调试x86进程也可调试x64进程。 将平台路径下的所有文件拷贝至其他PC&#xff0c;运行msvsmon.exe。 工具栏选择“工具&#xff08;T&#xff09;”…

Ubuntu18.04安装ROS

1.添加ROS软件源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.listcurl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc输入指令&#xff1a;curl -s https:…

密码学原理精解【6】

文章目录 置换密码密码体制加解密过程置换置换运算定义置换运算的例子集合与置换置换规则两行表示法轮换表示法置换运算的结果置换的性质注意事项 分组加解密 理论基础1. 准备工作2. 置换过程3. 置换密码的具体实现方式4. 安全性分析5. 置换密码的应用代换密码代换密码的工作原…

Python中EMD的安装教程

第一步&#xff1a;首先安装两个包 pip install pyemd pip install EMD-signal第二步&#xff1a;然后&#xff0c;进行改名 安装完之后&#xff0c;找到包所在的位置&#xff0c;然后要将原来pyemd的文件夹名称改为PyEMD&#xff1a;

cleanshot Mac 上的截图工具

笔者闲来无事&#xff0c;最近在找一些mac上好用的工具其中一款就是cleanShot。为什么不用原有的mac自带的呢。因为相对来说编辑功能不算全面&#xff0c;不支持长截图。那有没有一款软件支持关于截图的好用工具呢。 所以笔者找了这款。安装包是直接安装就可使用的。请大家点赞…

Golang | Leetcode Golang题解之第237题删除链表中的节点

题目&#xff1a; 题解&#xff1a; func deleteNode(node *ListNode) {node.Val node.Next.Valnode.Next node.Next.Next }

Python中的UnboundLocalError是什么错误?如何解决?

如果代码报错UnboundLocalError, 大概率犯了以下错误&#xff1a; money 10000 # 当前存款def add_money(value):money valueif __name__ __main__:print(当前存款:, money)add_money(1000)print(当前存款:, money)其中&#xff0c;变量money表示当前存款&#xff1b;函数…

DialogFragment 开发手游sdk代替透明的activity

前言 各位同学大家好 有段时间没有给各位更新文章了,最近在写新的项目 之前的手游sdk 都是用透明的activity 效果有缺陷,现在我改成用这个dialogfragment 来实现 , 废话不多说我们正式开始 效果图 : 为什么要使用dialogfragment: 之前开发手游sdk的时候 我这边都是使用透…

【区块链 + 智慧政务】区块链 +ETC 下一代公路联网收费关键技术优化项目 | FISCO BCOS应用案例

2020 年&#xff0c;我国取消省界收费站项目完成后&#xff0c;随着收费模式与收费方式的变化&#xff0c;形成了以门架为计费单元的新收 费体系&#xff1a;按照车辆通行门架数&#xff0c;RSU 天线读取 ETC 卡、电子标签 OBU 或 CPC 卡内标识的车型信息&#xff0c;车型门架计…

ALlegro批量替换封装?

1&#xff0c;此种情况批量修改同名封装&#xff0c;即改前改后的封装名相同 2&#xff0c;首先将改好后的封装放于库路径下 3&#xff0c;place ----update symbols —package symbols ----选择修改的封装名 4&#xff0c;refresh 完成

开源PS2模拟器 PCSX2 2.0版发布 性能与功能全面升级

时隔多年之后&#xff0c;备受玩家喜爱的PS2模拟器PCSX2迎来了重大更新&#xff0c;2.0版本正式发布&#xff01;此次更新包含了大量改进&#xff0c;几乎涵盖了模拟器各个方面&#xff0c;为玩家带来更流畅、更便捷的游戏体验。 下载地址&#xff1a; https://pcsx2.net/ 界…

Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器

章节内容 上节我们完成了&#xff1a; ZNode的基本介绍ZNode节点类型的介绍事务ID的介绍ZNode实机测试效果 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff…

C语言性能优化背后技术详解

引言 C语言因其高效和接近硬件的特性&#xff0c;在性能敏感的应用中得到了广泛的应用。然而&#xff0c;要写出高性能的C代码&#xff0c;需要对C语言的内部机制和计算机体系结构有深入的理解。本文将深入探讨C语言性能优化的背后技术&#xff0c;揭示其原理&#xff0c;并通…

品牌形象的智能塑造:Kompas.ai如何构建品牌视觉识别

品牌形象是企业在消费者心中构建的独特印象&#xff0c;它对于品牌识别和记忆度至关重要。一个一致且具有辨识度的品牌形象能够帮助企业在激烈的市场竞争中脱颖而出。Kompas.ai&#xff0c;作为一款智能设计工具&#xff0c;正帮助品牌塑造和维护其独特的视觉识别系统。 一致的…

JMeter进行HTTP接口测试的技术要点

参数化 用户定义的变量 用的时候 ${名字} 用户参数 在参数列表中传递 并且也是${} csv数据文件设置 false 不忽略首行 要首行 从第一行读取 true 忽略首行 从第二行开始 请求时的参数设置&#xff1a; 这里的名称是看其接口需要的请求参数的名称 这里的变量名称就是为csv里面…

【AI应用探讨】—生成对抗网络(GAN)应用场景

目录 1. 图像生成 2. 数据增强 3. 图像编辑与风格转换 4. 视频生成 5. 游戏设计 6. 其他领域 1. 图像生成 应用场景&#xff1a; 艺术创作&#xff1a;艺术家和设计师使用GAN生成的图像作为创作的灵感&#xff0c;创造出新颖、独特的艺术品。GAN可以生成具有特定风格的…

帮助中心如何提高用户粘性和活跃度?

帮助中心&#xff08;Help Center&#xff09;是在产品网站或者产品内部设立的一个功能模块&#xff0c;用于将产品使用上遇到的问题&#xff0c;或者关于产品的所有问题进行汇总&#xff0c;并通过Q&A&#xff08;问题与解答&#xff09;的形式展现给用户&#xff0c;帮助…

【linux】服务器重装系统之系统盘写入准备

【linux】服务器重装系统之系统盘写入准备 【创作不易&#xff0c;求点赞关注收藏】&#x1f600; 文章目录 【linux】服务器重装系统之系统盘写入准备一、前期准备1、准备一个U盘&#xff0c;并进行格式化2、下载UltralSO工具3、下载对应的Ubuntu版本 二、写入操作教程 一、…