为什么需要Natasha?
知识储备
一直到现在为止,仍有不少人在问动态编译是什么,Emit 用在哪些场景,表达式树怎么用,建议如果还不了解的同学先去找资料学习一下,比如吃粮的文章。
当代支柱
动态编译是支撑当代 .NET 生态 的重要支柱之一,这项技术 “服务” 于各种官方和非官方名库。动态编译的核心是 MSIL ,编写 IL 代码官方提供了 Emit 技术,但 Emit 编写和维护是很痛苦的事,比如语法糖还原、异步方法、指令兼容、大量元数据操作、错误调试、动态自动机、复杂业务的动态构建等等,在 500 行 EmitCode 的面前,大部分人会面露难色,在 200 行跳转标签面前抓耳挠腮,在 100 个 BadIL 面前手足无措,这其中耗费的表情恐怕只有开源项目作者知道。
既然这东西这么重要为什么不封装一下呢?官方提供了相对人性化的表达式树,但这也仅仅改善了编写便利,却额外引入了一些新的东西,比如基于表达式树的配置与解析等等。
解决之路
Roslyn 的出现让我看到了生态百花齐放的希望 ,它让 Emit 变得透明,并允许我们使用 C# 代码进行动态编译。这是王道啊,兄弟们,这是新时代的大彩之道啊。这套方案无异于鸟枪换炮,有人可能会比较在意官方的态度,这里可以说,官方是推荐这么做的,只不过你能不能驾驭得了的问题,这项技术带来的成本是引用依赖、错误处理、分域加载等问题。经一系列的调研、整理、测试之后,Natasha 已解决上述问题并于 2019 年正式面向大众,目前 Natasha 在 netcore/net5 版本中发布了稳定版,在这两年的发展中,我们从整合到解耦,从中规中矩到新科技应用,Natasha 正在走一个由 无 ——> 有 ——> 整 ——> 精 ——> 轻 的路线。接下来我将结合示例详细讲解 Natasha 的应用.
简单应用场景
到此我们学习了如何使用 Natasha 构建类, 我们可以尝试自己完成一些简单场景, 比如实现一个 AOP 代理类, 如果你对 AOP 代理类有足够的了解, 我相信 5 分钟即可有小成.
之前有写过例子,可供参考. 还可动态构建 Contoller 以实现动态 API 功能, 但这需要 MVC/WebAPI 相关的知识. 另可以结合 FreeSql 等支持 CodeFirst 的 ORM 在程序初始化时创建表结构, 有些公司实体要求低侵入性, 甚至 0 侵入性, 此时你可以使用 Natasha 构建带有标签侵入的临时类来代替实体类完成部分功能.
Natasha 是实打实的动态实战项目, 上面列举的示例都需要具备一定的编程基础才行, 如果没有需求和思考建议不要生搬硬套.
计划
本篇文章揭露了 Natasha 的冰山一角,接下来我们会探讨更多的科技以及应用.