编写Fx模块教程

276 阅读3分钟

这篇文章是该系列的一部分 GoLang:建立一个网络服务器

上一篇文章中,我们探讨了如何使用Fx库将一个手动接线的HTTP网络服务器转换成基于DI的网络服务器。现在,一旦我们有了这些,我们的下一步就是为我们的服务器添加功能,即业务逻辑。但在这之前,我们需要先了解如何为我们的Fx服务器编写模块。这些模块将作为我们应用程序的构建块。

什么是模块?

一般来说,模块是一块独立的、可互换的程序,这样每个模块就包含了执行所需功能的一个方面所需的一切。(来源:维基百科)。

当我们写一行代码时,我们用它实现一个小目标。这可能是我们的业务逻辑,修剪一个字符串的尾部空格,也可能是获得当前的系统时间,等等。这些情况中的每一个都是独特的,可以独立存在,并有其意义,那么我们是否应该去创建一个模块出来呢?嗯,我不这么认为。

我们在定义模块的时候应该考虑周全。创建模块的理想情况是,你想封装一些行为,使其在整个应用程序中可重复使用,有时也可在应用程序之外使用。一般来说,这种行为会通过一个接口暴露在模块之外。例如,创建模块的几个好的用例是日志模块、度量模块、授权模块等。

请确保你了解库、框架和模块之间的区别。

什么是Fx模块?

正如我们在上一篇文章中所看到的,Fx所做的就是将一个对象注入另一个对象。为了将对象A注入到对象B中,它需要事先有对象A的位置。那么,它首先从哪里得到对象A呢?

令人困惑...对吗?

让我们试着简化一下,当Fx创建一个新的对象(我们称之为OBJ1,以下简称OBJ1)时,它会查找OBJ1需要的依赖关系。

情况1:不需要依赖性,OBJ1在应用程序上下文中被创建。

情况2:Fx在应用程序上下文中找到所需的依赖关系,注入它们,OBJ1被创建。

这些都是在哪里发生的?它发生在fx.provide调用中,而fx.provide又是一个模块的一部分,其职责是创建OBJ1,并在Fx生命周期中调用New方法时将其提供给应用程序上下文。(Fx文档)

Fx的设计是基于模块化编程的概念。每当你在使用Fx实现DI的应用程序中写下一行代码时,它总是一些模块的一部分(除非手动连接)。当你把你的应用程序转换为Fx应用程序时,你已经在一个模块中写了代码。

我们的第一个Fx模块:LoggerFx

我们将尝试在我们已经建立的网络服务器中加入记录功能。为此,我们将使用zap作为一个日志库(由uber建立)。我们添加一个名为loggerfx.go的文件:

// ProvideLogger to fx

的文件,然后将main.go更新至此:

func main() {

我们已经准备好运行应用程序,它将在"/"路线上提供 "Hello World "响应。但这次我们在控制台中也看到了log Listening on localhost:8080的信息。

go run main.go

Voila!这就是在Fx中写一个模块的简单方法。请在Github上找到这些代码。

请注意,我们使用了Zap 在Fx 框架内来创建LoggerFx 模块.希望这能帮助你更好地理解这三个术语的区别。

现在,你获得Fx模块的实践经验的任务是将HTTP处理程序转换成一个模块。编码愉快!

编码趣闻: 计算机 "bug "一词的灵感来自于一个真实的bug。它是由Grace Hopper在1947年创立的。