查看: 49|回复: 0

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

[复制链接]

3

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2010-7-21
发表于 2026-4-24 16:41:00 | 显示全部楼层 |阅读模式

一、请求处理管道(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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部