.NET 管道、中间件、配置系统、依赖注入 (DI) 生命周期

一、请求处理管道(Pipeline)

 

1. 是什么?

 
ASP.NET Core 处理 HTTP 请求的一条流水线。   请求进来 → 依次经过多个中间件 → 响应返回。  

2. 核心特点

 

  • 单向进入,双向返回   请求:从上到下执行中间件   响应:从下到上原路返回
  • 顺序至关重要   先注册的中间件先执行
  • 可短 – circuit(短路)   某个中间件直接返回响应,后面的中间件不再执行

 

3. 形象比喻

  管道 = 医院看病流程   挂号 → 分诊 → 看病 → 缴费 → 拿药   请求必须按顺序走完全程。  


 

二、中间件(Middleware)

 

1. 是什么?

  管道里的每一个处理环节,是一个可以处理请求 / 响应的独立组件。  

2. 两种写法

 

① 内联中间件

 

app.Use(async (context, next) =>
{
    // 请求进来
    Console.WriteLine("请求处理前");

    // 调用下一个中间件
    await next();

    // 响应返回
    Console.WriteLine("响应处理后");
});

 

② 自定义中间件类

 

public class MyMiddleware
{
    private readonly RequestDelegate _next;

    public MyMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 逻辑
        await _next(context);
    }
}

 

3. 常用中间件(静态文件 → CORS → 路由 → 认证 → 授权 → 控制器)

 

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();    // 路由
app.UseCors();       // 跨域
app.UseAuthentication(); // 认证
app.UseAuthorization();  // 授权
app.MapControllers();

 

4. 三个核心方法区别

 

  • Use:可以执行 next,也可以不执行(最常用)
  • Run:短路,不调用 next,请求到此结束
  • Map:按路径分支,如 /admin 走一套中间件

 


 

三、配置系统(Configuration)

 

1. 是什么?

 
ASP.NET Core 读取配置的统一系统,支持多数据源、热重载、强类型绑定。  

2. 默认加载顺序(后面覆盖前面)

 

  1. appsettings.json
  2. appsettings.{Environment}.json
  3. 用户机密(开发环境)
  4. 环境变量
  5. 命令行参数

 

3. 读取配置的三种方式

 

① 直接读

 

var connStr = builder.Configuration["ConnectionStrings:Default"];

 

② 绑定到强类型类(最佳实践)

 

builder.Configuration.GetSection("Jwt").Bind<JwtOptions>();

 

③ 注入 IOptions<T>

 

public class Service(IOptions<JwtOptions> options)
{
}

 

4. 三种 IOptions 区别

 

  • IOptions<T>:单例,不热更新
  • IOptionsSnapshot<T>:作用域,每个请求重新加载
  • IOptionsMonitor<T>:单例,实时热更新

 


 

四、依赖注入(DI)与 生命周期

 

1. 是什么?

  框架自动帮你创建对象、管理对象生命周期、注入依赖。  

2. 三大生命周期(面试必考)

 

① Singleton(单例)

 

  • 整个应用只创建一个实例
  • 线程不安全
  • 适合:无状态、工具类、配置、日志

 

builder.Services.AddSingleton<IMyService, MyService>();

 

② Scoped(作用域)

 

  • 每个请求创建一个实例
  • 请求结束销毁
  • 最常用:EF Core DbContext、业务服务

 

builder.Services.AddScoped<IMyService, MyService>();

 

③ Transient(瞬时)

 

  • 每次使用都创建新实例
  • 最轻量
  • 适合:无状态、轻量级服务

 

builder.Services.AddTransient<IMyService, MyService>();

 

3. 生命周期禁止 “降级”(黄金规则)

  长生命周期服务 不能 依赖 短生命周期服务   错误:  

  • Singleton → Scoped
  • Singleton → Transient

  正确:  

  • Scoped → Singleton
  • Transient → Scoped / Singleton

 

4. 注入方式

 

  1. 构造函数注入(官方推荐)
  2. 方法注入
  3. 属性注入(.NET 8+ 支持)

 


 

一张表

   

概念 核心作用 关键点
管道 请求处理流程 顺序执行、双向往返、可短路
中间件 管道中的处理单元 Use/Run/Map、顺序决定功能
配置系统 读取配置 多源覆盖、强类型、热更新
Singleton 单例 全局一个、线程不安全
Scoped 作用域 一个请求一个、DbContext 专用
Transient 瞬时 每次都新实例

 


 

总结

 

  1. 管道是请求的必经之路,中间件是路上的关卡
  2. 中间件顺序决定功能能否正常运行(认证必须在授权前)
  3. 配置支持多来源,推荐用强类型 + IOptions
  4. 生命周期:Scoped 最常用,严禁长生命周期依赖短生命周期

文章摘自:https://www.cnblogs.com/chuansheng/p/19913211