在Go中使用Fx进行依赖性注入教程

460 阅读4分钟

作为专业人士,我们不应该停止学习。学习是确保我们保持需求并继续为客户提供价值的唯一真正途径。医生、律师和科学家都是备受尊敬的专业人士,他们都注重不断学习。为什么程序员应该有所不同?

因此,继续我们在上一篇文章中的内容。一旦我们在GoLang中建立并运行了一个基本的HTTP服务器,下一步就是建立项目的基础,这样我们就可以轻松地编写更多的代码来满足服务的不同使用情况。

什么是依赖性注入?

一种实现倒置控制以解决依赖关系的软件设计模式被称为依赖注入(或DI)。在依赖注入中,"依赖 "是可以使用的对象(服务),"注入 "是将依赖传递给依赖对象或将使用它的客户端。依赖性注入是控制反转(IOC)的一个子集...

上述定义是你在多个地方读过多次的东西,但不知何故,它并没有坚持下去。所以这里有一个更简单的版本。

依赖注入是一种对象构成的模式。一个父对象为子对象提供所有需要的依赖。

其中:

  1. 对象是实例化和配置其使用的子对象的对象。
  2. 对象是被设计为被动实例化的组件。也就是说,它被设计为使用由父对象提供的任何依赖关系,而不实例化自己的依赖关系。

依赖性注入基本上有3种类型,即:

  1. 构造器注入
  2. 设置器注入
  3. 基于接口的注入

什么是Fx?

根据Uber发布的官方文档,Fx是一个Go的应用框架,它:

  1. 使得依赖性注入变得简单。
  2. 消除了对全局状态和func init()的需求。

Fx使用构造器注入模式,让我们试着了解它究竟是如何使Go中的依赖注入变得简单的。

我强烈建议你在进一步阅读之前先看一下 Fx文档之后 再继续阅读

为了保持简单,我们将尝试把前文中的HTTP服务器转换为Fx应用程序:

  1. 第一步是通过go getgo.uber.org/fx安装该库。
  2. 在main.go中编辑Fx App的初始化程序。如果你用go run main.go来运行它,你将会有一个基本的Fx服务器在运行,没有任何服务。
func main() {

3.3.现在,我们将为应用程序提供HTTP服务Mux,将其添加到新的.NET文件中。我们需要将其提供给应用程序上下文,以便将其注入到我们的HTTP处理程序中。

func main() {

4.4.根据Fx规范更新HTTP处理程序的代码,这样它就可以被提供给应用程序上下文。更新后的代码看起来像这样。

package httphandler
// HelloWorld handler which recieves the user request

是的,你是对的,没有什么变化。它与我们为手动接线的服务器所写的代码完全相同*,* 这就是Fx的魅力所在。

5.最后一步也是最后一步是启动我们的监听器,为此我们将利用Fx的生命周期钩子。我们将继续更新main.go文件,如下所示。

func main() {

我们已经准备好运行应用程序,它将在"/"路线上提供 "Hello World "响应。

go run main.go

请在Github上找到这些代码

我明白,与我们在手动连接的服务器中所做的相比,这可能看起来不是一个巨大的成就,而且乍一看可能会让人困惑。东西是如何和在哪里被实例化的?钩子到底是什么?fx.New(something).Run()到底是做什么的?.....,还有很多问题。

但是,相信我,随着我们的Web服务器开发系列的推进,你会意识到一个好的DI框架为你的项目增加了什么价值。虽然DI有很多优点,但也有一些缺点。

  1. 依赖注入创建的客户端要求配置细节由构造代码提供。当明显的默认值可用时,这可能会很困难。
  2. 依赖注入会使代码难以追踪(阅读),因为它将行为与构造分开。这意味着开发者必须参考更多的文件来了解系统的运行情况。
  3. 它需要更多的前期开发工作。

现在,我们已经探讨了依赖注入和Fx的基础知识。在下一篇文章中,我们将尝试学习Fx模块的基础知识。我们还将尝试在我们的演示HTTP服务器中添加这些网络服务器的基本构件,看看Fx模块是如何在整个过程中使我们的生活变得轻松的。

编码趣闻: 世界上第一个程序员是一位女性。她的名字叫Ada Lovelace,她在1800年的时候从事分析引擎的工作。