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

news/2024/5/19 23:06:37 标签: .netcore, asp.net, 依赖注入

🐳前言

        🍀在.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.niftyadmin.cn/n/5438539.html

相关文章

Apache Paimon 使用 Postgres CDC 获取数据

a.依赖准备 flink-connector-postgres-cdc-*.jarb.Synchronizing Tables&#xff08;同步表&#xff09; 在Flink DataStream作业中使用 PostgresSyncTableAction 或直接通过flink run&#xff0c;可以将PostgreSQL中的一个或多个表同步到一个Paimon表中。 <FLINK_HOME&g…

SpringMVC重点记录

目录 1.学习重点2.回顾MVC3.回顾servlet4.初始SpringMVC4.1.为什么要学SpringMVC?4.2.SpringMVC的中重点DispatcherServlet4.3.SpringMVC项目的搭建4.4.MVC框架要做哪些事情?4.5.可能会遇到的问题 5.SpringMVC的执行原理6.使用注解开发SpringMVC7.Controller控制总结8.RestF…

031—pandas 读取解析实验室数据至DataFrame

前言 某个科研实验室在进行一项物理实现&#xff0c;实验仪器会输出一个 txt 文本的数据&#xff0c;研究人员需要从这个文本中将数据结构化才能进行进行统计分析。 在为个解析和分析过程中&#xff0c;他们选择了 Python 的 pandas 库来完成这些操作。我们今天来完成这这个 t…

Hadoop集群常用的两个脚本(查看所有服务器java进程+集群启停)

目录 脚本存放的路径查看所有进程群起/群停脚本 脚本存放的路径 在一台常用的服务器上编写脚本 同时希望 该脚本能在任意位置执行 那也就要配置环境变量了! 那我把bin目录创建出来 在这里面写脚本 这样的话 就不需要我再手动配置环境变量了!! 查看所有进程 jps不是Hadoop的…

如何入职车载测试

以下课件都可以学习&#xff0c;一对一教你如何入职车载 可以学习的内容如下&#xff1a;第一&#xff1a;仪表项目、导航项目、车控项目、OTA升级项目、UDS诊断项目。第二&#xff1a;DBC数据库制作、CDD数据库制作。第三&#xff1a;项目规范文档阅读、调查表理解。第四&…

CSS3DObject 分子公式demo 实现

CSS3DRenderer, CSS3DObject, CSS3DSprite API 使用方式详解 <!DOCTYPE html> <html><head><title>three.js css3d - molecules</title><meta charset"utf-8"><meta name"viewport" content"widthdevice-widt…

数据结构:详解【顺序表】的实现

1. 顺序表的定义 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。动态顺序表与数组的本质区别是——根据需要动态的开辟空间大小。 2. 顺序表的功能 动态顺序表的功能一般有如下几个&#xff1a; 初始化顺序表打印顺序…

探索潜力,变成更好的自己——人大女王金融硕士项目引领你走向成功之路

在这个竞争激烈的时代&#xff0c;不断提升自己的能力和素质已经成为了每个人的必修课。而对于那些渴望在金融领域取得突破的人来说&#xff0c;中国人民大学女王金融硕士项目无疑是一个理想的选择。这个项目不仅能够帮助你提升专业技能&#xff0c;更能够让你在这个过程中发现…