最近看到公司的项目都在改用dig做di,ioc。我自己很排斥,但是又感觉自己不用很特立独行的感觉,来社区问问诸位大佬,为什么这么多人推崇dig?
使用dig,确实只需要在main,当中provide一次
```go
//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行代码。