新闻详情

新闻详情

首页 / 资讯中心 / 详情

解构引擎——依赖注入(DI)与中间件管道

发布时间:2026/9/22 23:52:57来源:尧图网络
解构引擎——依赖注入(DI)与中间件管道
、前言从“作坊”到“工厂”在上一篇文章中我们学会了C#的现代语法就像掌握了制造精密零件的技术。现在我们需要把这些零件组装成一台能运转的发动机。在ASP.NET Core中有两样东西构成了这台发动机的骨架依赖注入DI和中间件。如果你不理解它们你写的代码可能会变成紧紧缠绕的一团乱麻我们称之为“面条代码”难以测试、难以修改。理解了它们你就掌握了现代Web开发的“设计模式之钥”。二、灵魂机制依赖注入DI2.1 为什么要“注入”——解决紧耦合假设你需要在一个API中记录日志。最直观的写法可能是直接在代码里new一个对象app.MapGet(/bad, () { var logger new FileLogger(); // 直接依赖具体的实现类 logger.Log(这是一条日志); return 日志已记录; });这种写法看似简单实则隐患重重紧耦合你的API代码死死地绑定了FileLogger。如果哪天老板说“改成存数据库”你得修改每一处new FileLogger()。难以测试做单元测试时你不想真的去写文件想用一个假的记录器但现在你无法替换。依赖注入的核心思想是“不要自己new需要什么向容器要”控制反转IoC。2.2 服务的三生三世生命周期在.NET的DI容器中注册的服务有三种主要生命周期。这是新手最容易踩坑的地方请务必理解Transient瞬态用完即弃。每次请求该服务容器都会给你一个全新的实例。适合轻量级、无状态的服务如简单的计算器、格式化工具。Scoped范围一次请求一生。在一次HTTP请求范围内无论你在多少个地方请求它拿到的都是同一个实例。这是Web开发中最常用的模式特别是用于数据库上下文DbContext。Singleton单例万世一系。整个应用程序生命周期内只存在一个实例。适合全局缓存、全局配置。注意单例服务必须是线程安全的2.3 实战构建一个性能监控服务我们来写一个真实的案例统计API的执行耗时。第一步定义契约接口良好的架构总是面向接口编程。// IPerformanceTracker.cs public interface IPerformanceTracker { void Start(); void Stop(); long GetElapsedTime(); }第二步实现服务// PerformanceTracker.cs public class PerformanceTracker : IPerformanceTracker { private Stopwatch _stopwatch new Stopwatch(); public void Start() _stopwatch.Restart(); public void Stop() _stopwatch.Stop(); public long GetElapsedTime() _stopwatch.ElapsedMilliseconds; }第三步在Program.cs中注册服务var builder WebApplication.CreateBuilder(args); // --- 注册服务 --- // 这里我们使用 Scoped因为耗时统计通常是针对单个请求的 builder.Services.AddScopedIPerformanceTracker, PerformanceTracker(); // 添加Swagger等基础服务 builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app builder.Build(); // ... 中间件配置 ...第四步在API中注入并使用在Minimal API中我们通过方法参数注入服务。app.MapGet(/test-performance, (IPerformanceTracker tracker) { tracker.Start(); // 模拟耗时操作 Thread.Sleep(500); tracker.Stop(); return $接口执行耗时: {tracker.GetElapsedTime()} ms; });架构师视角的深意 注意看我们的API代码里完全没有new PerformanceTracker()。这意味着如果明天我们需要升级监控逻辑比如加上日志记录我们只需要修改PerformanceTracker.cs类而API接口的代码一行都不用动。这就是解耦带来的维护性提升。三、传动装置中间件管道如果说DI是提供动力的气缸那么中间件就是负责传递动力的齿轮和传送带。3.1 管道模型俄罗斯套娃ASP.NET Core 处理HTTP请求的方式就像水流通过一系列过滤层。请求进入管道。经过一个个中间件。中间件可以在处理前做事如记录请求日志。中间件调用next()将请求传给下一个中间件。到达最终处理逻辑你的API代码。响应沿着管道反向流出。中间件可以在处理后做事如记录响应日志、处理异常。3.2 编写你的第一个自定义中间件我们来写一个最简单的中间件请求计时器。它将在控制台打印每个请求的耗时。var app builder.Build(); // --- 自定义中间件 --- app.Use(async (context, next) { var stopwatch new Stopwatch(); stopwatch.Start(); Console.WriteLine($[中间件] 请求开始: {context.Request.Path}); // 关键步骤调用下一个中间件 // 这里使用 await 等待后续管道全部执行完毕 await next(context); stopwatch.Stop(); Console.WriteLine($[中间件] 请求结束: {context.Request.Path}, 耗时: {stopwatch.ElapsedMilliseconds}ms); }); // 确保有Swagger中间件 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.MapGet(/, () Hello World!); app.Run();运行这段代码并在浏览器访问http://localhost:5000/你会看到控制台输出了耗时信息。3.3 “短路”机制权限守门员中间件有一个极其重要的能力短路。如果中间件决定不调用next()管道就会直接折返后续的逻辑如你的API代码将不会执行。这非常适合做权限验证。app.Use(async (context, next) { // 模拟检查Header里是否有密码 if (!context.Request.Headers.ContainsKey(X-Secret-Key)) { // 没有密钥直接返回401不调用 next() context.Response.StatusCode 401; await context.Response.WriteAsync(抱歉
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3个技巧一文搞懂allppt源码,告别版本升级API变更 2026/9/23 4:22:00

3个技巧一文搞懂allppt源码,告别版本升级API变更

3个技巧一文搞懂allppt源码,告别版本升级API变更 刚升级完依赖,打开IDE满屏红色报错? allppt 的 parse 方法突然没了,取而代之的是一堆陌生的泛型参数?这种“版本升级后 API 全变了”的痛,每个写过 PPT…

阅读更多 →
档案库房温湿度均衡管控:从设备运维到材料监护 2026/9/23 4:21:48

档案库房温湿度均衡管控:从设备运维到材料监护

1. 档案库房温湿度失衡不是“小问题”,而是系统性风险的导火索我第一次走进某市级档案馆恒温恒湿库房时,空调出风口正对着一排民国时期纸质卷宗,温湿度探头却装在离它三米远的墙角。当时值班员说:“数值看着正常啊,22℃…

阅读更多 →
日语翻译软件下载避坑指南:3个实战技巧让你面试加分 2026/9/23 4:21:41

日语翻译软件下载避坑指南:3个实战技巧让你面试加分

日语翻译软件下载避坑指南:3个实战技巧让你面试加分 看了一堆教程还是不会写项目?别慌,这不是你笨,是你没抓住 最佳实践 的核心逻辑。很多同学在准备技术面试时,容易陷入“背八股文”的误区,忽略了工具链在实际业务中的落地能力。今天咱们不聊虚的,…

阅读更多 →
边缘计算控制器如何解决工业实时控制的时延与可靠性难题 2026/9/23 4:21:35

边缘计算控制器如何解决工业实时控制的时延与可靠性难题

1. 先算传统方案的三笔账:控制上云为什么常常“算不过账”先把场景定在这:一条五十米长的产线,十几个工位,PLC、传感器、变频器、机器人控制器分散各处,中控室里一台服务器兼着SCADA和数据库,云端还挂着一个…

阅读更多 →
避坑指南:影音先锋av看片资源库实战项目环境配置全解析 2026/9/23 4:21:35

避坑指南:影音先锋av看片资源库实战项目环境配置全解析

避坑指南:影音先锋av看片资源库实战项目环境配置全解析 配置环境就卡半天?别急,这通常是依赖地狱的开端。做影音先锋av看片资源库这类 实战项目 ,环境不干净,代码写得再漂亮也跑不起来。很多新手在 CSDN…

阅读更多 →
CUA智能体实战:从像素到点击的界面操作自动化 2026/9/23 4:21:35

CUA智能体实战:从像素到点击的界面操作自动化

我调试过最让人窒息的一个Bug,是我自研的CUA在自动登录时,连续四次把账号密码填进了隔壁的注册表单。明明提示词里写了“点击登录”,屏幕上也有巨大的“登录”按钮,模型就是执着地认定了另一个长得几乎一模一样的输入框。那一整晚…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞