Golang使用dig真的会比直接func注入跟new好?
最近看到公司的项目都在改用dig做di,ioc。我自己很排斥,但是又感觉自己不用很特立独行的感觉,来社区问问诸位大佬,为什么这么多人推崇dig?
使用dig,确实只需要在main,当中provide一次
//main.go
func buildContainer() *dig.Container {
container := dig.New()
container.Provide(models.InitStorager)
//container.Provide(api.DI_Tools)
return container
}
重点是每次需要使用到这个对象的地方都充斥着各种Invoke
//router.go
var data *models.OperatorUser
db.Invoke(func(s *models.Storager) { //w.Header["userid"]
data, ok = s.OperatorUser.Get(&models.OperatorUserGetParam{userid, validForm.Owner})
})
var userid string
var ok bool
db.Invoke(func(s *models.Storager) {
Mlok, Mlid := s.OperatorUser.MlidIdGet(validForm.Owner)
USeridok, USerid := s.OperatorUser.UseridGet(validForm.Owner)
if !Mlok || !USeridok {
return
}
userid = USerid
ok = s.OperatorUser.Set(&models.OperatorUserSetParam{
Userid: USerid,
Mlud: Mlid,
Email: utils.emailBuild(USerid), //// oper_guid@mail.com
Avatar: validForm.Avatar,
//Phone: Input.Phone,
Nickname: validForm.Nickname,
Owner: validForm.Owner})
})
//一点都不美观,一点都不美观,一点都不美观
看到整份代码走哪都能看到Invoke,整个人都不好了,先不说wwcd大牛说的di framework造成的性能影响,光看到这个代码就觉得一点都gopher.
//使用new,使用func注入咋了,使用init()咋了
db:=new(models.Storager)
db:=InitStorager("config.yml" || config)
感觉都比整份代码都是Invoke好,好歹我还知道我要的啥,nil,panic还好查些。
不懂为何那么多人觉得使用全局变量,使用init就滥用了。
*我并不排斥依赖注入,我并不排斥依赖注入,我并排斥依赖注入,重要的事情要说3遍。
感觉go就应该走的是那种大道至简的道,我相信用go写微服务,小工具的还是占大数,没必要一个服务2W行代码能搞定的整成3W行代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
go 的依赖注入还没怎么用过,但貌似现在都比较看好 wire,go-cloud 中也用到了它.
用这个吧 简单粗暴https://github.com/bzeron/inject
维护起来,确实看不太明白。能简单的尽量不要复杂
Invoke 不是初始化的时候用的吗?
文档里说了的嘛:
不评价代码好不好(虽然想吐槽),但是就看起来感觉真的巨难受,读代码读起来好累,能一步搞定的,非要分几步,自己写起来感觉良好,完全不考虑别人维护起来的感受。
有些全局变量是合理的啊,比如db,config。
init也正常吧,但是要理清楚执行顺序。
其实主要是他写的太难看了
看看这种会不会觉得好看一点:
dig不能滥用,我个人感觉应该是在初始化的时候才用到,可以看到我在代码中无序的注册Provide,然后我在main中Invoke时就不需要考虑执行顺序的问题。
1.dig用到了反射,这种影响性能的操作怎么想都应该是不能常用的
2.应该用在初始化上,比如service、db,初始化之后赋值到一个全局变量上