【C#】.net core 6.0 依赖注入生命周期

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
对于.net core而言,依赖注入生命周期有三种瞬态(Transient)、作用域(Scoped)和单例(Singleton),无论使用哪种生命周期,都需要确保对象的线程安全性,并正确地处理依赖关系。

在这里插入图片描述

目录

  • 一、程序生命周期
    • 2.1、构造函数
    • 2.2、配置
    • 2.3、启动
    • 2.4、运行
    • 2.5、停止
    • 2.6、释放资源
  • 二、依赖注入生命周期
    • 2.1、瞬态生命周期
    • 2.2、作用域生命周期
    • 2.3、单例生命周期
  • 三、代码举例
    • 3.1、瞬态生命周期
    • 3.2、作用域生命周期
    • 3.3、单例生命周期
  • 四、自定义管理
  • 五、依赖注入原理

一、程序生命周期

在了解依赖注入的生命周期前,我们先建单了解下应用程序的生命周期,
在 .NET Core 6.0 中,应用程序的生命周期包括以下阶段:

2.1、构造函数

在应用程序启动时,会调用构造函数来创建主机(Host)对象。

2.2、配置

在构造函数之后,会调用配置方法来设置应用程序的配置,例如添加服务、配置中间件等。

2.3、启动

配置完成后,会调用启动方法来启动应用程序,包括启动 HTTP 服务器、启动后台服务等。

2.4、运行

应用程序开始监听请求并进行处理,这是应用程序的主要运行阶段。

2.5、停止

当应用程序接收到停止信号时(如收到终止命令或服务器关闭),会触发停止方法来执行一些清理操作。

2.6、释放资源

在停止之后,应用程序释放资源并进行善后工作,如关闭数据库连接、释放资源等。

除了上述阶段外,还可以通过使用生命周期中的事件钩子来添加自定义逻辑,以便在特定时刻执行某些代码。
需要注意的是,不同类型的应用程序(如控制台应用程序、Web 应用程序等)的生命周期可以有所不同,但上述阶段是通用的核心生命周期。

二、依赖注入生命周期

在 .NET Core 6.0 中,依赖注入服务的生命周期有三种:瞬态(Transient)、作用域(Scoped)和单例(Singleton)。

2.1、瞬态生命周期

在每次请求时都会创建一个新的实例,并在请求结束时立即销毁该实例,适用于轻量级的对象。这种生命周期可以通过
services.AddTransient 方法进行注册。

2.2、作用域生命周期

在每个 HTTP 请求处理期间,会使用同一个实例,请求结束时实例也会被销毁,适用于线程安全的对象,如 EF 上下文。这种生命周期可以通过
services.AddScoped 方法进行注册。

2.3、单例生命周期

在整个应用程序生命周期中只会创建一个实例,适用于被多处使用的对象,如配置信息、单例服务等。这种生命周期可以通过
services.AddSingleton 方法进行注册。

除了上述生命周期外,还可以通过 services.AddSingleton 方法传递一个工厂方法,以实现自定义的生命周期管理。
无论使用哪种生命周期,都需要确保对象的线程安全性,并正确地处理依赖关系。正确使用依赖注入可以提高代码的可测试性和可维护性,将对象的创建和销毁等生命周期管理交由 DI 容器负责,从而简化代码的编写。

三、代码举例

当使用 .NET Core 6.0 进行依赖注入时,可以使用以下代码示例来演示瞬态、作用域和单例生命周期

3.1、瞬态生命周期

public interface ITransientService
{
void DoSomething();
}

public class TransientService : ITransientService
{
private readonly Guid _id;

public TransientService()
{_id = Guid.NewGuid();
}public void DoSomething()
{Console.WriteLine($"TransientService ID: {_id}");
}

}

// 在 Startup.cs 的 ConfigureServices 方法中添加以下代码:
services.AddTransient<ITransientService, TransientService>();

// 在需要使用服务的地方,使用构造函数注入:
public class MyController
{
private readonly ITransientService _transientService;

public MyController(ITransientService transientService)
{_transientService = transientService;
}// 使用服务
public void MyAction()
{_transientService.DoSomething();
}

}

3.2、作用域生命周期

public interface IScopeService
{
void DoSomething();
}

public class ScopeService : IScopeService
{
private readonly Guid _id;

public ScopeService()
{_id = Guid.NewGuid();
}public void DoSomething()
{Console.WriteLine($"ScopeService ID: {_id}");
}

}

// 在 Startup.cs 的 ConfigureServices 方法中添加以下代码:
services.AddScoped<IScopeService, ScopeService>();

// 在需要使用服务的地方,使用构造函数注入:
public class MyController
{
private readonly IScopeService _scopeService;

public MyController(IScopeService scopeService)
{_scopeService = scopeService;
}// 使用服务
public void MyAction()
{_scopeService.DoSomething();
}

}

3.3、单例生命周期

public interface ISingletonService
{
void DoSomething();
}

public class SingletonService : ISingletonService
{
private readonly Guid _id;

public SingletonService()
{_id = Guid.NewGuid();
}public void DoSomething()
{Console.WriteLine($"SingletonService ID: {_id}");
}

}

// 在 Startup.cs 的 ConfigureServices 方法中添加以下代码:
services.AddSingleton<ISingletonService, SingletonService>();

// 在需要使用服务的地方,使用构造函数注入:
public class MyController
{
private readonly ISingletonService _singletonService;

public MyController(ISingletonService singletonService)
{_singletonService = singletonService;
}// 使用服务
public void MyAction()
{_singletonService.DoSomething();
}

}

以上示例展示了如何在 .NET Core 6.0 中注册和使用瞬态、作用域和单例生命周期的依赖注入服务。
根据实际需求,选择适合的生命周期以确保正确的对象创建和销毁,并维护正确的对象状态。

四、自定义管理

当通过 services.AddSingleton 方法传递一个工厂方法时,可以使用委托来创建自定义的生命周期管理。

  • 下面是一个示例代码:
    首先,定义一个自定义的服务类 CustomService:
    public class CustomService
    {
    public DateTime CreatedAt { get; }

    public CustomService()
    {
    CreatedAt = DateTime.Now;
    }
    }

然后,在应用程序启动时,注册该服务并传递一个工厂方法来实现自定义的生命周期管理:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(serviceProvider =>
{
// 创建 CustomService 对象,并进行自定义的处理
var customService = new CustomService();

        // 在此可以添加自定义的生命周期管理逻辑return customService;});// 其他服务的注册// ...
}

}

在上述示例中,通过 services.AddSingleton(serviceProvider => { … }) 方法向 DI 容器注册了一个 CustomService 类型的单例服务,传递了一个工厂方法作为参数。
在这个工厂方法中,我们可以自定义创建 CustomService 对象的方式,并进行额外的处理。
这样,当通过 DI 容器解析 CustomService 时,每次获取到的都是通过工厂方法创建的同一个实例,而且可以根据需要在工厂方法中进行自定义的生命周期管理操作。
需要注意的是,工厂方法可以接收一个 IServiceProvider 参数,以便在创建服务实例时获取其他已注册的服务。这在某些场景下可能会很有用。

五、依赖注入原理

在 .NET Core 6.0 中,依赖注入(DI)是一个重要的功能,它通过提供、解析和跟踪应用程序中的各种服务对象来帮助解耦和组织代码。
依赖注入的原理主要包括以下几个方面:
1.服务注册:在应用程序启动时,通过使用
IServiceCollection 接口的 AddTransient、AddScoped、AddSingleton 等方法将服务类型和其生命周期添加到 DI 容器中。
2.服务解析:当需要使用某个服务的实例时,可以通过 DI 容器提供的
IServiceProvider 接口的 GetRequiredService、GetService 等方法来获取该服务的实例,其中 T 是服务类型。
3.生命周期管理:DI 容器会根据服务的生命周期设置来控制服务对象的创建和销毁。根据服务的生命周期,可以使用
AddTransient、AddScoped、AddSingleton 方法注册瞬态、作用域和单例服务。

  • 瞬态(Transient)生命周期表示每次通过 DI 容器获取服务时都会创建一个新的实例。
  • 作用域(Scoped)生命周期表示在同一个作用域内(例如,相同的 HTTP 请求)获取服务时将使用同一个实例。
  • 单例(Singleton)生命周期表示整个应用程序中只创建一个实例,并且所有的请求都会使用同一个实例。
    1.依赖关系解析:DI 容器能够自动解析服务对象之间的依赖关系,即当需要解析某个服务时,DI 容器会自动创建该服务所依赖的其他服务实例,并将其注入到需要的位置上。
    2.服务扩展:通过扩展
    IServiceCollection 接口,可以自定义添加和配置服务,使得 DI 容器能够支持更多的功能和扩展。

总体而言,.NET Core 6.0 的依赖注入原理基于 DI 容器、服务注册、服务解析和生命周期管理,帮助开发者更好地组织和管理应用程序中的各种服务对象,提高代码的可扩展性、可测试性和松耦合性。

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

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

相关文章

数据结构-如何实现一个队列?逐步解析与代码示例(超详细)

文章目录 前言1.队列的基本概念2.链表与数组实现队列的区别2.1数据存储结构2.2性能2.3内存使用 3.为什么选择链表实现队列&#xff1f;4.结构定义函数声明 5.核心操作5.1初始化 (QInit)5.2销毁 (QDestroy)5.3入队 (QPush)5.4出队 (QPop) 6.队列的查询操作6.1队首元素 (QueueFro…

如何将语音版大模型AI接入自己的项目里(语音ChatGPT)

如何将语音版大模型AI接入自己的项目里语音ChatGPT 一、语音版大模型AI二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、语音版大模型AI 基于阿里通义千问、百…

分享5款实用的小工具,提升你的工作效率

​ 工作中&#xff0c;简单而实用的小工具能够为我们带来事半功倍的效果。这五款工具可能是你工作效率提升的关键。 1.云存储——Dropbox ​ Dropbox是一款流行的云存储服务&#xff0c;可以让你在不同的设备上同步和访问你的文件。你可以将你的文件上传到Dropbox的服务器上&…

绝缘电阻测试仪的测量范围有多少?它的测量方法是什么?

绝缘电阻测试仪广泛应用于设备检测和故障排除。它广泛应用于电力检测行业。甚至可以说&#xff0c;电力设备离不开绝缘电阻测试仪设备。对于许多经验丰富的电力测试工人来说&#xff0c;绝缘电阻测试仪的常规测量范围和方法应该非常清楚。在本文中&#xff0c;我们将向一些新的…

学之思开源考试系统是一款 java + vue 的前后端分离的考试系统

学生系统功能 模块介绍登录用户名、密码注册年级、用户名、密码任务中心管理员发布的年级任务&#xff0c;每个学生只能做一次考试题干支持文本、图片、数学公式、表格等&#xff0c;学生答题支持&#xff1a;文本固定试卷可重复练习、自行批改的试卷时段试卷在时间限制内&…

关于chatglm3 function calling的理解

ChatGLM3-6B开源了工具调用&#xff0c;好奇他是怎么实现的&#xff0c;所以写了这个文章记录。 一、测试官方的示例 官方给的示例很简单&#xff0c;只不过给的两个函数 track 和 text-to-speech 没有具体的实现&#xff0c;模型的输出也只是给出了需要调用的函数名和参数。剩…

【C语言】指针详解(四)

目录 1.assert断言 2.指针的使用和传址调用 2.1strlen的模拟使用 2.2传值调用和传址调用 1.assert断言 assert.h头文件定义了宏 assert()&#xff0c;用于在运行时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终止运行。这个宏常常被称为“断言”。 例如…

多模态——CLIP:Contrastive Language-Image Pre-training解读

前言 随着人工智能技术的不断进步&#xff0c;多模态成为备受瞩目的研究方向。多模态技术旨在融合不同类型的数据和信息&#xff0c;以实现更准确、高效的人工智能应用。有学者认为它代表了所有模型发展的最终趋势。这类模型旨在接受多种不同的输入方式&#xff0c;例如图像、…

OpenStack搭建和部署

Centos官网qcow2镜像修改root账号密码&#xff0c;开启ssh等 wget http://172.16.20.10/vmtemplate/KVM/wangrui/Debian/debian-10.2.0-openstack-amd64.qcow2 一、查看镜像文件信息 [debian-10.2-cloud] nameDebian 10.2.0 (Buster) Cloud osinfodebian10 archx86_64 fi…

Linux Debian12使用podman安装upload-labs靶场环境

一、upload-labs简介 PHP语言编写&#xff0c;持续收集渗透测试和CTF中针对文件上传漏洞的靶场&#xff0c;总共21关&#xff0c;每一关都包含着不同的上传绕过方式。 二、安装podman环境 Linux Debian系统如果没有安装podman容器环境&#xff0c;可以参考这篇文章先安装pod…

透过许战海矩阵洞察安记食品增长战略

引言&#xff1a;安记食品如果想实施增长战略&#xff0c;建议深耕招牌产品,走向全国市场,目前招牌产品咖哩和复合调味粉市场空间没有被全面释放出来,需要科学的产品战略作为支撑。安记食品选择功能性产品方向是正确的,但“功能性”需要一个大品类作为载体,牛奶,饮料是最大的载…

网站被恶意扫描怎么办(上WAF)

在网络安全领域&#xff0c;有一大类工具被广泛使用&#xff0c;且作用不可忽视&#xff0c;它就是网络安全扫描器。扫描器是一种专门设计用来评估计算机、网络或者应用中已知的弱点的计算机程序&#xff0c;但是很多人恶意使用&#xff0c;找到网站弱点进行攻击。 扫描器的种…

K8S理论

kubernetes&#xff1a;8个字母省略&#xff0c;就是k8s 自动部署自动扩展和管理容器化部署的应用程序的一个开源系统 k8s是负责自动化运维管理多个容器化程序的集群&#xff0c;是一个功能强大的容器编排工具 分布式和集群化的方式进行容器化管理 版本有1.15 .1.18 .1.20 …

问答区故意在结题前回答混赏金的狗

此贴专记录CSDN问答社区里面&#xff0c;一些回答者在临近结题时胡乱回答&#xff0c;只为分取结题赏金的人。 所有图片均为事实&#xff0c;绝无半点虚假。各位看官可以自行搜索问题题目或者通过查看此人回答求证 所有图片均为事实&#xff0c;绝无半点虚假。各位看官可以自行…

c语言中数据结构

一、结构体的由来 1. 数据类型的不足 C语言中&#xff0c;基本数据类型只有整型、字符型、浮点型等少数几种&#xff0c;无法满足复杂数据类型的需要。 2. 数组的限制 虽然数组可以存储多个同类型的数据&#xff0c;但是数组中的元素个数是固定的&#xff0c;无法动态地改变…

渗透测试——1.3计算机网络基础

一、黑客术语 1、肉鸡&#xff1a;被黑客攻击电脑&#xff0c;可以受黑客控制不被发现 2、端口&#xff08;port&#xff09;&#xff1a;数据传输的通道 3、弱口令&#xff1a;强度不高&#xff0c;容易被猜到的口令、密码 4、客户端&#xff1a;请求申请电脑&#xff08;…

10. UVM Environment

环境为agents, scoreboards和其他验证组件&#xff08;包括有助于在 SoC 级别重用块级环境组件的其他环境类&#xff09;提供良好的层次结构和容器。用户定义的 env 类必须从 uvm_env 类扩展。 10.1 uvm_env class hierarchy 类声明&#xff1a; virtual class uvm_env extend…

k8s的二进制部署(一)

k8s的二进制部署&#xff1a;源码包部署 环境&#xff1a; k8smaster01: 20.0.0.71 kube-apiserver kube-controller-manager kube-schedule ETCD k8smaster02: 20.0.0.72 kube-apiserver kube-controller-manager kube-schedule Node节点01: 20.0.0.73 kubelet kube-pr…

nodejs+vue+ElementUi大学新生入学系统的设计与实现1hme0

采用B/S模式架构系统&#xff0c;开发简单&#xff0c;只需要连接网络即可登录本系统&#xff0c;不需要安装任何客户端。开发工具采用VSCode&#xff0c;前端采用VueElementUI&#xff0c;后端采用Node.js&#xff0c;数据库采用MySQL。 涉及的技术栈 1&#xff09; 前台页面…

Stable Diffusion模型原理

1 Stable Diffusion概述 1.1 图像生成的发展 在Stable Diffusion诞生之前&#xff0c;计算机视觉和机器学习方面最重要的突破是 GAN&#xff08;Generative Adversarial Networks 生成对抗网络&#xff09;。GAN让超越训练数据已有内容成为可能&#xff0c;从而打开了一个全新…