fx是 go.uber.org/fx 依赖注入包,目前ipfs的启动过程采用了fx的方式
附上学习总结:
1.fx.New(...)是fx初始化的地方,启动时主要里面包含[]Option,启动后生成根对象app
2.Option的设计思路是让参数传递更加优雅,libp2p也是采用这种方式,原作者文章:https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html
3.目前的Option主要包含:provide start/stopTimeout supply validate invoke annotated等, ipfs只使用了provide和invoke
4.provide是将多个构造函数放到fx中,支持组合放入,放入之后fx会对每个option展开,然后一一放入fx中,效果和单个放入每个option一样,但是方便了option过多时的管理,如:
```
app :=fx.New(
node.IPFS(ctx,cfg),
//fx.NopLogger,
fx.Extract(n),
)
```
5.invoke是触发调用option中构造函数的地方,只有invoke中依赖的provide才会执行,完成这个依赖才执行效果的是uber的另外一个库:go.uber.org/dig, fx像是dig的一个壳,(时间关系,未能再去研究)
6.fx中还有一个lifecycle的概念,直接隶属于根对象app,用于完成对象启动和停止时的Hook(钩子)操作,主要包含OnStart和OnStop两个方法,用户可以在要初始化的对象中定义自己的OnStart/OnStop方法,然后append到app.lifecycle.Hooks中
7.app的启动主要包含start stop run,其中run就是将start和stop组合起来,调用一次相当于两个都调用了,ipfs是直接用的start/stop
8.fx.New步骤:
1.按添加顺序加载provide
2.加载lifecycle
3.加载dotGraph,用于构建对象引用图,在dig中实现
4.按照添加顺序加载invoke中的方法,都加载之后,再执行invoke中的方法
9.app.start:按照hook append的顺序依次执行每个对象初始化时添加进lifecycle的Onstart,默认若15s内未执行完,视为出错,app.start失败,程序退出。所以不要在hook中做监听类的事情
10.app.stop:按照hook append的相反顺序依次执行每个对象初始化时添加进lifecycle的Onstop,默认若15s内未执行完,视为出错,app.stop失败,程序退出。所以不要在hook中做监听类的事情
11.总流程:
网友评论