timzaak / blog

8 stars 1 forks source link

依赖注入 #54

Closed timzaak closed 4 years ago

timzaak commented 4 years ago

最近看 actix-web 源码,惊叹于 API 的简洁性,故深入研究了一下。再结合以前编码的经验,输出此篇文章。

依赖注入按照注入的时间点,分为编译时注入,和运行时注入。Spring、Go 那一套是运行时,Rust,目前看到的框架基本上是编译时。 运行时的注入,基本思路,是找 mark,构造依赖图,生成实例 or 实例proxy。难点是循环依赖如何初始化以及性能。

而问题是,编译时期的排错没了,以及到底有哪些实例生成,还需要跑起来看。常规的语言特性依赖就是:反射+类型判定。

编译时的,具体还要看语言的支持能力,一般来讲,是宏+全局变量,就 Rust 来说,是宏命令生成 + thread_local(全局变量)。问题是,宏的 Debug 很难搞,还没有找到一套简单的方法来观察宏生成的代码到底是怎样的,更多的是凭借经验以及对语言的掌握程度,猜测宏是否存在,以及存在的位置。

Scala 的话,虽然有运行时 DI 框架,但我的代码都是人肉 object+lazy val,好Debug和随心所欲的选择实例的实现。代价就是模版有点多。

timzaak commented 4 years ago

不对, Rust 应该也是运行时,宏命令生成依赖查找代码。