ASP .Net Core 8.0 依赖注入的三种注入模式

🐳前言

        🍀在.NET中,依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦组件之间的依赖关系

        依赖注入的核心思想是将对象的依赖关系(即对象所需的其他服务或组件)从对象内部创建转移到外部容器来管理。这样,对象不需要知道其依赖的具体实现细节,只需要通过构造函数、属性或方法等注入所需依赖即可。这种模式提高了代码的模块化和可测试性,同时也使得替换和扩展依赖变得更加容易

🐳生命周期

在使用依赖注入时,.NET提供了不同的服务生命周期选项

主要的生命周期选项包括:

  • Transient(瞬时):每次请求都会创建一个新的实例。这意味着即使在同一请求中多次请求同一个服务,也会得到不同的实例。适用于轻量级、无状态的服务。
  • Scoped(作用域):在一个请求范围内共享同一个实例。这意味着在同一个请求中多次请求同一个服务,会得到相同的实例。适用于有状态的服务,但不需要跨请求共享状态。
  • Singleton(单例):整个应用程序生命周期内只创建一个实例,并且每次请求都会返回这个相同的实例。适用于需要跨请求共享状态的服务。

🐳项目举例

🍀我们创建一个ASP .NET Core Web Application 项目,Type选择Web API

🍀项目创建好之后,我们分别创建一个接口和一个实现类用于演示

public interface IHelloService
{void Hello();
}
public class HelloService : IHelloService
{private string _id;public HelloService(){_id = Guid.NewGuid().ToString();}public void Hello(){Console.WriteLine("hello!   id是:" + _id);}
}

🍀然后我们对原来的program类改造一下

using System.Dynamic;
using testWebApi.Services;var builder = WebApplication.CreateBuilder(args);// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();//瞬态,每次请求时都会创建一个新的实例
builder.Services.AddTransient<IHelloService, HelloService>();
//上下文,在同一个请求范围内,只会创建一个实例
// builder.Services.AddScoped<IHelloService, HelloService>();
//单例,在整个应用程序生命周期内,只会创建一个实例
// builder.Services.AddSingleton<IHelloService, HelloService>();var app = builder.Build();if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();app.MapGet("/weatherforecast", (IHelloService HelloService,IHelloService HelloService2) =>{HelloService.Hello();HelloService2.Hello();}).WithName("GetWeatherForecast").WithOpenApi();app.Run();

🍀这段代码是.NET 6及以后版本引入的Minimal API语法糖

app.MapGet("/weatherforecast", ...):

  • app 是一个Web应用程序的构建器对象,它提供了许多方法来定义Web端点。
  • MapGet 是一个扩展方法,用于定义一个响应HTTP GET请求的端点。
  • "/weatherforecast" 是这个端点的URL路径。

(IHelloService HelloService,IHelloService HelloService2) => { ... }:

  • 这是一个lambda表达式,它定义了当端点被请求时应该执行的代码。
  • 在lambda的参数列表中,我们有两个IHelloService类型的参数:HelloServiceHelloService2。这意味着当这个端点被请求时,依赖注入系统会尝试为这两个参数提供实例。

当注入模式为瞬时Transient时,通过构造函数获取的两次IHelloService,都生成了新的Id,意味着每次请求该类都创建了一个新的实例

使用作用域Scoped注入时,获取两次IHelloService输出的id是一致的,但再次请求这个地址时,id就变了,意味着在一次http请求时,这个实例只会创建一次,在下一次的http请求中才会创建新的实例

 最后一个单例模式无论请求多少次,id始终是一样的,跟我们的静态方法static有点类似,只有当整个应用重启,才会创建一个新实例

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

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

相关文章

蓝桥杯物联网竞赛_STM32L071_12_按键中断与串口中断

按键中断&#xff1a; 将按键配置成GPIO_EXTI中断即外部中断 模式有三种上升沿&#xff0c;下降沿&#xff0c;上升沿和下降沿都会中断 external -> 外部的 interrupt -> 打断 trigger -> 触发 detection -> 探测 NVIC中将中断线ENABLE 找接口函数 在接口函数中写…

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题&#xff0c;相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题&#xff0c;导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因&#xff0c;只是看到一些连锁反应带来的结果…… 影响因素…

统计-R(相关系数)与R^2(决定系数)

1.相关系数&#xff08;R&#xff09; 定义&#xff1a;考察两个事物&#xff08;在数据里我们称之为变量&#xff09;之间的相关程度。 假设有两个变量X&#xff0c;Y&#xff0c;那么两个变量间的皮尔逊相关系数可通过以下公式计算&#xff1a; 公式一&#xff1a; 其中…

CCF-CSP认证考试 202305-1 重复局面 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202305-1 重复局面 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任…

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

一、缓存雪崩 简单理解&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间 (例如&#xff1a;设置缓存时采用了相同的过期时间&#xff0c;在同一时刻出现大面积的缓存过期)&#xff0c;所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库CPU和内存造成…

File文件对象

在计算机系统中&#xff0c;文件是非常重要的存储方式。Files&#xff08;java.nio.file.Files&#xff09;提供了多种方法来处理文件系统中的文件。比直接使用File文件要方便。 Files工具类:读取指定文件中的所有文本 package study1;import java.io.IOException; import ja…

trpc-go 博客系统

trpc-go 博客系统 使用go语言构建的全栈项目&#xff0c;充分利用了go的简洁性、高性能和并发处理能力。 系统采用了trpc-go框架和北极星进行分布式开发&#xff0c;展示了如何基于腾讯开源技术栈构建微服务架构&#xff0c;实现高效的服务通信和管理。 https://github.com/…

项目管理系统私有化部署解决方案!找企智汇软件!

企智汇项目管理软系统是一款支持私有化部署的项目管理系统&#xff0c;适合大型、中型、小型企业的不同需求。企智汇软件是一个专业的项目全周期管理平台&#xff0c;拥有10年的项目管理经验&#xff0c;以项目为中心&#xff0c;通过计划控制进度&#xff0c;预算控制成本&…

HTML5语义化元素

在HTML5之前&#xff0c;网站的分布层级有哪些呢&#xff1f; nav&#xff0c;header&#xff0c;main&#xff0c;footer 这样做有一个弊端 我们往往过多的使用div&#xff0c;通过ID或class来区分元素 对于浏览器来说这些元素不够语义化 对于我来说搜索引擎来说&#xff0c;不…

云原生部署手册01:构建k8s集群并配置持久化存储

写在前面&#xff1a;k8s弃用docker的影响其实没那么大 k8s通过dockershim对docker的支持从1.20版本后就已经移除&#xff0c;仅支持符合Container Runtime Interface(CRI)的容器运行环境&#xff0c;比如containerd。containerd本身就是docker底层的容器运行环境&#xff0c;…

海康威视相机SDK二次开发(JAVA语言)

目录 前言客户端创建虚拟相机示例代码保存图片程序运行结果修改需求 二次开发引入外部包对SaveImage.java文件进行修改保存图片saveDataToFile方法选择相机chooseCamera方法主方法 FileUtil类处理过期照片启动类与配置文件application.yml通过实体类读取yml启动类 SaveImage.ja…

供应链投毒预警 | 开源供应链投毒202402月报发布啦

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年2月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

Linux uucico命令教程:UUCP文件传输服务程序(附实例详解和注意事项)

Linux uucico命令介绍 uucico&#xff0c;全称UUCP文件传输服务程序&#xff0c;是用来处理uucp或uux送到队列的文件传输工具。uucico有两种工作模式&#xff1a;主动模式和附属模式。当在主动模式下时&#xff0c;uucico会调用远端主机&#xff1b;在附属模式下时&#xff0c…

快速搭建一个一元二次方程flask应用

新建flask_service目录、templates子目录 flask_service —— app.py —— templates —— —— index.html app.py from flask import Flask, request, jsonify, render_template import random import matplotlib.pyplot as plt from io import BytesIO import base64app F…

分布式 Session--一起学习吧之架构

一、定义 分布式Session是指在一个分布式系统中&#xff0c;多个服务器之间共享用户的会话信息。在Web应用中&#xff0c;Session通常用于跟踪用户的状态和会话数据。然而&#xff0c;在分布式系统中&#xff0c;由于用户请求可能被分发到不同的服务器上&#xff0c;因此需要一…

jenkins Pipeline接入mysql

背景&#xff1a; jenkin pipeline进化过程如下&#xff1a; Jenkins Pipeline 脚本优化实践&#xff1a;从繁琐到简洁 >>>>> Jenkins Pipeline脚本优化&#xff1a;为Kubernetes应用部署增加状态检测>>>>>> 使用Jenkins和单个模板部署多个K…

BootScrap详细教程

文章目录 前言一、BootScrap入门二、导航三、栅格系统四、container五、面板六、媒体对象七、分页八、图标九、实现动态效果 前言 BootScrap是别人帮我们写好的CSS样式。如果想要使用BootScrap&#xff0c;需要先下载下来&#xff0c;在页面上引入&#xff0c;编写HTML需要按照…

Ubuntu 23.10 tar包安装和配置Elasticsearch kibana 7.13.3

目录 一、环境说明 二、准备工作 三、安装elasticsearch 3.1 安装elasticsearch 3.2 添加服务和设置开机启动 四、安装kibana 4.1. 安装kibana 4.2 添加服务和设置开机启动 出于工作需要&#xff0c;需要在Ubuntu 23.10系统上通过tar包方式安…

QT 商品入库与出库(库存管理系统)

商品入库 void GoodsWarehousing::InitComboBoxFunc() // 初始化Combo box控件 {int i0;QSqlQuery sqlQuery;sqlQuery.exec("SELECT * FROM commoditydatatable");QString StrId;while(sqlQuery.next()){StrIdsqlQuery.value(0).toString();ui->comboBox_Id->…

华岳M9制造企业管理软件业务流程 1/4

华岳M9制造企业管理软件业务流程 1/4 版本特征主控概念步骤1 部署一、服务器端二、客户端 步骤2 基础一、填写授权信息及操作权限分配二、设置业务期间三、账套参数设置四、设置分类目录五、其他基础设置六、功能模块管理 华岳M9制造企业管理软件业务流程&#xff0c;贯彻存货总…