最近看到公司的项目都在改用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行代码。
不评价代码好不好(虽然想吐槽),但是就看起来感觉真的巨难受,读代码读起来好累,能一步搞定的,非要分几步,自己写起来感觉良好,完全不考虑别人维护起来的感受。
有些全局变量是合理的啊,比如db,config。
init也正常吧,但是要理清楚执行顺序。