Go反射框架Fx

一、概述

Fx是一个golang版本的依赖注入框架,它使得golang通过可重用、可组合的模块化来构建golang应用程序变得非常容易,可直接在项目中添加以下内容即可体验Fx效果。

import "github.com/uber-go/fx"

Fx是通过使用依赖注入的方式替换了全局通过手动方式来连接不同函数调用的复杂度,也不同于其他的依赖注入方式,Fx能够像普通golang函数去使用,而不需要通过使用struct标签或内嵌特定类型。这样使得Fx能够在很多go的包中很好的使用。 接下来会提供一些Fx的简单demo,并说明其中的一些定义。

二、Fx应用

1、一般步骤

  • 按需定义一些构造函数:主要用于生成依赖注入的具体类型

type FxDemo struct{
 // 字段是可导出的,是由于golang的reflection特性决定: 必须能够导出且可寻址才能进行设置
  Name string  
}
func NewFxDemo(){
  return FxDemo{
    Name: "hello, world"
  }
}
  • 、使用Provide将具体反射的类型添加到container中 可以按需添加任意多个构造函数

fx.Provide(NewFxDemo)  
  • 、使用Populate完成变量与具体类型间的映射

  • 、新建app对象(application容器包括定义注入变量、类型、不同对象liftcycle等)

  • 、使用

大致的使用步骤就如下。下面会给出一些完整的demo

2、简单demo 将io.reader与具体实现类关联起来

输出:

3、使用struct参数 前面的使用方式一旦需要进行注入的类型过多,可以通过struct参数方式来解决

输出

如果通过Provide提供构造函数是生成相同类型会有什么问题?换句话也就是相同类型拥有多个值呢? 下面两种方式就是来解决这样的问题。 4、使用struct参数+Name标签 在Fx未使用Name或Group标签时不允许存在多个相同类型的构造函数,一旦存在会触发panic。

输出

上面通过Name标签即可完成在Fx容器注入相同类型 5、使用struct参数+Group标签 使用group标签同样也能完成上面的功能

输出

基本上Fx简单应用在上面的例子也做了简单讲解

三、Fx定义

1、Annotated(位于annotated.go文件) 主要用于采用annotated的方式,提供Provide注入类型

源码中Name和Group两个字段与前面提到的Name标签和Group标签是一样的,只能选其一使用 2、App(位于app.go文件) 提供注入对象具体的容器、LiftCycle、容器的启动及停止、类型变量及实现类注入和两者映射等操作

至于Provide和Populate的源码相对比较简单易懂在这里不在描述 具体源码arrow-up-right 3、Extract(位于extract.go文件) 主要用于在application启动初始化过程通过依赖注入的方式将容器中的变量值来填充给定的struct,其中target必须是指向struct的指针,并且只能填充可导出的字段(golang只能通过反射修改可导出并且可寻址的字段),Extract将被Populate代替。具体源码arrow-up-right 4、其他 诸如Populate是用来替换Extract的,而LiftCycle和inout.go涉及内容比较多后续会单独提供专属文件说明。

四、其他

在Fx中提供的构造函数都是惰性调用,可以通过invocations在application启动来完成一些必要的初始化工作:fx.Invoke(function); 通过也可以按需自定义实现LiftCycle的Hook对应的OnStart和OnStop用来完成手动启动容器和关闭,来满足一些自己实际的业务需求。

Last updated