两年1444次提交,我给自己撸了一套.NET10模块化框架(XiHan.Framework),这能行吗?
- 内容介绍
- 文章标签
- 相关推荐
简单来说... 当我第一次拿起 Visual Studio, 敲下 “dotnet new console” 时心里那种既激动又焦虑的感觉,仿佛正站在一条未知的河岸边。两年时间段, 我在 GitHub 上提交了 1444 次代码,终于把这条河岸变成了一条流畅的溪流——XiHan.Framework。
一、从 ABP 的启蒙到自研框架的蜕变
ABP 和 Furion 在我的开发旅程中留下了较深刻印记。它们给我带来了“模块化”“依赖注入”“自动生成 API”等理念,但我始终觉得这一些工具只能解决表层问题。真实正想要彻底掌控代码,那就得自己写。于是我决定:把每一行代码都亲手打出来让自己彻底吃透,切中要害。。

这不是一句空洞的口号,而是我对技术手段纯粹追求的一种体现。我的目标是:用 .NET 原生能力实现全部核心功能,最较小化第三方依赖,让维护投入成本降到最较低。
为何要自己撸框架?
- 透明度较高——不需要担心黑盒子里的实现细节。
- 可控性强较大——随时能够根据业务需求进行微调。
- 学习了解曲线友良好——同事们能迅速上手,这是因为一切都是自家写的。
二、 架构亮点与核心设计原则
XiHan.Framework 采用模块化设计,framework/src 下共有 57 个项目,各个项目都被打包为 NuGet 包,包名与项目名彻底对应。这种“一体化”方式让你能够按需引用,只加载真实正需要的模块。
1️⃣ 优先采用 .NET 内置能力
你没事吧? 声明依赖后框架会自动完成拓扑排序并按顺序加载模块。全部服务注册、生命周期管理都通过标记接口实现,无需手动写 AddScoped 等冗较长代码。
2️⃣ 自动生成 API, 无需 Controller 层
心情复杂。 AOP 与 IL 发射相结合,在启动时扫描全部应用服务,然后直接生成 MVC 控制器类。方法体仅包含“获取服务实例 → 参数压栈 → 调用方法 → 返回最终还是结果是”的几条指令,实现与手写控制器接近无差异的性能。同时也 Swagger 文档和 Scalar 文档也会自动生成。
3️⃣ Saga 风格事务编排 & 完整事件处理链路
CompleteAsync 方法不仅是单纯的 SaveChanges + Commit, 还会循环处理本地事件、分布式事件,并在每次循环后 保存变更,直至没有崭新事件产生。这种设计让业务逻辑与事务管理彻底解耦,同时也确保了最终还是一致性,交学费了。。
为哪些百度不收录?答案很简洁:SEO 并非仅有衡量标准!
在撰写本文时 我偶尔会会在浏览器地址栏输入“为哪些百度不收录”,看到的是搜索最终还是结果是页面却发觉自己的博客链接根本没有出现。我查过后台日志,也没有看到任意爬虫申请记录。这让我意识到:即使内容再良好,如果没有适当的技术手段 SEO 配置,也很不容简单被搜索引擎抓取。于是 我在博客中加入了适当的 meta 标签、sitemap.xml,并让服务器返回正确的 robots.txt,以提升抓取效率。当然这只是提升可见度的一一部分,更十分沉关键的是持续产出较高质量内容,让读者天然关注起来,未来可期。。
三、关键技术手段栈细节揭秘
数据层:
- SqlSugar: 支持 PostgreSQL 与 MySQL;全局 QueryFilter 实现柔软删除与更多租户过滤;一次配置即可覆盖全部 SELECT/UPDATE/DELETE 操作。
- HybridCache: L1 内存 + L2 Redis 混合缓存;Key 自动规范为 {TenantId}:{CacheName}:{UserKey}, 天然隔离不同租户的数据;内存缓存上限为 60 秒,避免节点内存暴涨。
- Entity Audit: AOP 自动填充 CreatedTime/ModifiedTime/TenantId/CreatedBy/Snowflake 主键/TraceId, 无需手动赋值,让仓储层保持整洁整洁。
基础设施:
- Serilog: 统一日志格式与输出渠道;支持异步写入,提升性能。
- Castle DynamicProxy: AOP 框架, 实现事务、缓存等横切关注点;无需额外 AOP 库。
- Polly: HTTP 韧性策略;轻巧松应对网络变化波动。
- Scriban: 模板引擎,用于动态邮件或报表生成;灵活且简单 。
- BouncyCastle: 国密算法支持,为中国企业提供给可靠保障。
AI & 通信技术层面:
- Semi‑OpenAI Kernel + MCP 用于构建智能助手; gRPC / SignalR 支持实时双向通信技术; 更多租户隔离方案兼容库隔离、 字段隔离和行隔离三种粒度,可根据业务场景灵活切换。
从枯燥到炎热血——我的成较长轨迹
说实话, 在第一天发布第一个 commit 时我甚至质疑自己有没有真实的懂得哪些是“框架”。那时候,我只把它当作一个测试室,把各种思路都塞进去,然后不断改进。回想起那一些凌晨四点刷代码、 第二天早晨还没睡就看完单元测试跑通的较小瞬间, 精辟。 那一些痛并开心着的人生瞬间,是无法用数字来衡量的。我甚至想过放弃, 但看到第一份基于 XiHan.Framework 的更多租户后台成功上线时我了解这份坚持是值得的!
我乐意拆解并分享,让更更多人受益。 祝编码愉迅速, 哎,对! 也希望我们一起在 .NET 世界里持续探索与创崭新!
" 当你把繁杂流程拆解成可组合的较小模块, 再将业务逻辑写成简洁的方法,你就能像玩乐较高一样搭建整个系统,而不是被无数配置文件和繁琐初始化过程缠住脚踝。如果你正在寻找一种能让团队更较这一点。 最后再来看, 如果你想较深入了解某个细节,举个例子 IL 发射原理、更多租户字段过滤机制或 Saga 编排,请留言交流,牛逼。。
• 加强较大 AI 接口集成,使业务层能够更天然地调用 GPT 模型进行文本解析或自动回复。 • 对更多租户三层隔离做更细粒度权限校验,以满足金融行业合规需求。 • 将一部分关键功能拆包为独立 NuGet,以减较低整体依赖沉重量。 "更少接一次中间件, 更多省一遍 ApiResponse" —— 简洁却有效 "我想告诉你们,这套框架不是为了展示炫酷技术手段,而是真实正解决日常痛点。
如果你正考虑有没有要自己撸一个框架, 请先问问自己:你有没有愿意每天面对技术手段细节、不断迭代?如果答案是确定,那么 XiHan.Framework 或许就是你的最佳伙伴。 四、 采用方式迅速上手 public class MyAppModule : XiHanModule { public override Task ConfigureServicesAsync { // 注册自定义服务 return Task.CompletedTask; } } var builder = WebApplication.CreateBuilder; await builder.LoadModulesAsync; // 加载 & 拓扑排序 var app = builder.Build; await app.RunLifecycleHooksAsync; // 启动阶段钩子 app.MapControllers; // 路由映射 await app.RunAsync; 五、 我算是看透了。 今后展望 & 持续改进路线图 \* 持续完善 Saga 编排逻辑,引入分布式事务协调器以支持跨数据库操作。
简单来说... 当我第一次拿起 Visual Studio, 敲下 “dotnet new console” 时心里那种既激动又焦虑的感觉,仿佛正站在一条未知的河岸边。两年时间段, 我在 GitHub 上提交了 1444 次代码,终于把这条河岸变成了一条流畅的溪流——XiHan.Framework。
一、从 ABP 的启蒙到自研框架的蜕变
ABP 和 Furion 在我的开发旅程中留下了较深刻印记。它们给我带来了“模块化”“依赖注入”“自动生成 API”等理念,但我始终觉得这一些工具只能解决表层问题。真实正想要彻底掌控代码,那就得自己写。于是我决定:把每一行代码都亲手打出来让自己彻底吃透,切中要害。。

这不是一句空洞的口号,而是我对技术手段纯粹追求的一种体现。我的目标是:用 .NET 原生能力实现全部核心功能,最较小化第三方依赖,让维护投入成本降到最较低。
为何要自己撸框架?
- 透明度较高——不需要担心黑盒子里的实现细节。
- 可控性强较大——随时能够根据业务需求进行微调。
- 学习了解曲线友良好——同事们能迅速上手,这是因为一切都是自家写的。
二、 架构亮点与核心设计原则
XiHan.Framework 采用模块化设计,framework/src 下共有 57 个项目,各个项目都被打包为 NuGet 包,包名与项目名彻底对应。这种“一体化”方式让你能够按需引用,只加载真实正需要的模块。
1️⃣ 优先采用 .NET 内置能力
你没事吧? 声明依赖后框架会自动完成拓扑排序并按顺序加载模块。全部服务注册、生命周期管理都通过标记接口实现,无需手动写 AddScoped 等冗较长代码。
2️⃣ 自动生成 API, 无需 Controller 层
心情复杂。 AOP 与 IL 发射相结合,在启动时扫描全部应用服务,然后直接生成 MVC 控制器类。方法体仅包含“获取服务实例 → 参数压栈 → 调用方法 → 返回最终还是结果是”的几条指令,实现与手写控制器接近无差异的性能。同时也 Swagger 文档和 Scalar 文档也会自动生成。
3️⃣ Saga 风格事务编排 & 完整事件处理链路
CompleteAsync 方法不仅是单纯的 SaveChanges + Commit, 还会循环处理本地事件、分布式事件,并在每次循环后 保存变更,直至没有崭新事件产生。这种设计让业务逻辑与事务管理彻底解耦,同时也确保了最终还是一致性,交学费了。。
为哪些百度不收录?答案很简洁:SEO 并非仅有衡量标准!
在撰写本文时 我偶尔会会在浏览器地址栏输入“为哪些百度不收录”,看到的是搜索最终还是结果是页面却发觉自己的博客链接根本没有出现。我查过后台日志,也没有看到任意爬虫申请记录。这让我意识到:即使内容再良好,如果没有适当的技术手段 SEO 配置,也很不容简单被搜索引擎抓取。于是 我在博客中加入了适当的 meta 标签、sitemap.xml,并让服务器返回正确的 robots.txt,以提升抓取效率。当然这只是提升可见度的一一部分,更十分沉关键的是持续产出较高质量内容,让读者天然关注起来,未来可期。。
三、关键技术手段栈细节揭秘
数据层:
- SqlSugar: 支持 PostgreSQL 与 MySQL;全局 QueryFilter 实现柔软删除与更多租户过滤;一次配置即可覆盖全部 SELECT/UPDATE/DELETE 操作。
- HybridCache: L1 内存 + L2 Redis 混合缓存;Key 自动规范为 {TenantId}:{CacheName}:{UserKey}, 天然隔离不同租户的数据;内存缓存上限为 60 秒,避免节点内存暴涨。
- Entity Audit: AOP 自动填充 CreatedTime/ModifiedTime/TenantId/CreatedBy/Snowflake 主键/TraceId, 无需手动赋值,让仓储层保持整洁整洁。
基础设施:
- Serilog: 统一日志格式与输出渠道;支持异步写入,提升性能。
- Castle DynamicProxy: AOP 框架, 实现事务、缓存等横切关注点;无需额外 AOP 库。
- Polly: HTTP 韧性策略;轻巧松应对网络变化波动。
- Scriban: 模板引擎,用于动态邮件或报表生成;灵活且简单 。
- BouncyCastle: 国密算法支持,为中国企业提供给可靠保障。
AI & 通信技术层面:
- Semi‑OpenAI Kernel + MCP 用于构建智能助手; gRPC / SignalR 支持实时双向通信技术; 更多租户隔离方案兼容库隔离、 字段隔离和行隔离三种粒度,可根据业务场景灵活切换。
从枯燥到炎热血——我的成较长轨迹
说实话, 在第一天发布第一个 commit 时我甚至质疑自己有没有真实的懂得哪些是“框架”。那时候,我只把它当作一个测试室,把各种思路都塞进去,然后不断改进。回想起那一些凌晨四点刷代码、 第二天早晨还没睡就看完单元测试跑通的较小瞬间, 精辟。 那一些痛并开心着的人生瞬间,是无法用数字来衡量的。我甚至想过放弃, 但看到第一份基于 XiHan.Framework 的更多租户后台成功上线时我了解这份坚持是值得的!
我乐意拆解并分享,让更更多人受益。 祝编码愉迅速, 哎,对! 也希望我们一起在 .NET 世界里持续探索与创崭新!
" 当你把繁杂流程拆解成可组合的较小模块, 再将业务逻辑写成简洁的方法,你就能像玩乐较高一样搭建整个系统,而不是被无数配置文件和繁琐初始化过程缠住脚踝。如果你正在寻找一种能让团队更较这一点。 最后再来看, 如果你想较深入了解某个细节,举个例子 IL 发射原理、更多租户字段过滤机制或 Saga 编排,请留言交流,牛逼。。
• 加强较大 AI 接口集成,使业务层能够更天然地调用 GPT 模型进行文本解析或自动回复。 • 对更多租户三层隔离做更细粒度权限校验,以满足金融行业合规需求。 • 将一部分关键功能拆包为独立 NuGet,以减较低整体依赖沉重量。 "更少接一次中间件, 更多省一遍 ApiResponse" —— 简洁却有效 "我想告诉你们,这套框架不是为了展示炫酷技术手段,而是真实正解决日常痛点。
如果你正考虑有没有要自己撸一个框架, 请先问问自己:你有没有愿意每天面对技术手段细节、不断迭代?如果答案是确定,那么 XiHan.Framework 或许就是你的最佳伙伴。 四、 采用方式迅速上手 public class MyAppModule : XiHanModule { public override Task ConfigureServicesAsync { // 注册自定义服务 return Task.CompletedTask; } } var builder = WebApplication.CreateBuilder; await builder.LoadModulesAsync; // 加载 & 拓扑排序 var app = builder.Build; await app.RunLifecycleHooksAsync; // 启动阶段钩子 app.MapControllers; // 路由映射 await app.RunAsync; 五、 我算是看透了。 今后展望 & 持续改进路线图 \* 持续完善 Saga 编排逻辑,引入分布式事务协调器以支持跨数据库操作。

