Golang使用dig真的会比直接func注入跟new好?

发布于 2022-09-11 17:05:42 字数 1604 浏览 71 评论 0

最近看到公司的项目都在改用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

尘世孤行 2022-09-18 17:05:42

go 的依赖注入还没怎么用过,但貌似现在都比较看好 wirego-cloud 中也用到了它.

风渺 2022-09-18 17:05:42

用这个吧 简单粗暴https://github.com/bzeron/inject

陈年往事 2022-09-18 17:05:42

维护起来,确实看不太明白。能简单的尽量不要复杂

葬﹪忆之殇 2022-09-18 17:05:42

Invoke 不是初始化的时候用的吗?
文档里说了的嘛:

container.Invoke(function(s *Server) {
    s.StartXXX()
})
朦胧时间 2022-09-18 17:05:42

不评价代码好不好(虽然想吐槽),但是就看起来感觉真的巨难受,读代码读起来好累,能一步搞定的,非要分几步,自己写起来感觉良好,完全不考虑别人维护起来的感受。

有些全局变量是合理的啊,比如db,config。
init也正常吧,但是要理清楚执行顺序。

枯寂 2022-09-18 17:05:42

其实主要是他写的太难看了
看看这种会不会觉得好看一点:

func BuildContainer() *dig.Container {
    container := dig.New()
    
    container.Provide(NewConfig)
    container.Provide(NewPersonService)
    container.Provide(NewServer)
    container.Provide(NewDB)
    container.Provide(ConnectDatabase)
    container.Provide(NewPersonRepository)

    return container
}

var myDB *DB

func main() {
    container := BuildContainer()
   
    err := container.Invoke(func(db *Server) {
        myDB = db
    })

    err := container.Invoke(func(server *Server) {
        server.Run()
    })

    if err != nil {
        panic(err)
    }
}

dig不能滥用,我个人感觉应该是在初始化的时候才用到,可以看到我在代码中无序的注册Provide,然后我在main中Invoke时就不需要考虑执行顺序的问题。
1.dig用到了反射,这种影响性能的操作怎么想都应该是不能常用的
2.应该用在初始化上,比如service、db,初始化之后赋值到一个全局变量上

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文