一文读懂Wire

Che Dan
15 min readJan 1, 2020

Wire 是啥

Wire 是一个轻巧的Golang依赖注入工具。它由Go Cloud团队开发,通过自动生成代码的方式在编译期完成依赖注入。

依赖注入是保持软件 “低耦合、易维护” 的重要设计准则之一。

此准则被广泛应用在各种开发平台之中,有很多与之相关的优秀工具。

其中最著名的当属 Spring,Spring IOC 作为框架的核心功能对Spring的发展到今天统治地位起了决定性作用。

事实上, 软件开发 S.O.L.I.D 原则 中的“D”, 就专门指代这个话题。

Wire 的特点

依赖注入很重要,所以Golang社区中早已有人开发了相关工具, 比如来自Uber 的 dig 、来自Facebook 的 inject 。他们都通过反射机制实现了运行时依赖注入。

为什么Go Cloud团队还要重造一遍轮子呢? 因为在他们看来上述类库都不符合Go的哲学:

Clear is better than cleverReflection is never clear.

— Rob Pike

作为一个代码生成工具, Wire可以生成Go源码并在编译期完成依赖注入。 它不需要反射机制或 Service Locators 。 后面会看到, Wire 生成的代码与手写无异。 这种方式带来一系列好处:

  1. 方便debug,若有依赖缺失编译时会报错
  2. 因为不需要 Service Locators, 所以对命名没有特殊要求
  3. 避免依赖膨胀。 生成的代码只包含被依赖的代码,而运行时依赖注入则无法作到这一点
  4. 依赖关系静态存于源码之中, 便于工具分析与可视化

团队对Wire设计的仔细权衡可以参看 Go Blog

虽然目前Wire只发布了 v0.4 .0,但已经比较完备地达成了团队设定的目标。 预计后面不会有什么大变化了。 从团队傲娇的声明中可以看出这一点:

It works well for the tasks it was designed to perform, and we prefer to keep it as simple as possible.

We’ll not be accepting new features at this time, but will gladly accept bug reports and fixes.

--

--