V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
chogath
V2EX  ›  程序员

求推荐 go 的 web 框架,要求是能实现依赖注入的相关玩法

  •  
  •   chogath · 2021-05-17 11:22:47 +08:00 · 5618 次点击
    这是一个创建于 1320 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类比:

    1. java 之 spring boot
    2. typescript 之 nest.js
    41 条回复    2021-05-21 01:15:22 +08:00
    SingeeKing
        1
    SingeeKing  
       2021-05-17 11:24:14 +08:00
    chogath
        2
    chogath  
    OP
       2021-05-17 11:28:44 +08:00   ❤️ 1
    我很多年前刚开始工作的时候,也是非常抵制依赖注入的,不就几个构造器嘛,有必要引入重量级 spring 框架么,直到后来写了一个大型系统,系统初始化的时候把一堆对象接来接去非常繁琐,经常一个构造器里会有七八个对象,而这样的构造器又有几十个,项目看上去像一坨屎,改代码像挑大粪。然后后面使用了 spring,改造后整个系统都清爽无比,才对依赖注入产生了不一样的看法。我个人理解,依赖注入这种东西只有在大型系统里用过才有体会。
    chogath
        3
    chogath  
    OP
       2021-05-17 11:31:07 +08:00
    Dogtler
        4
    Dogtler  
       2021-05-17 11:40:04 +08:00   ❤️ 1
    有趣,你又懂鼓唇弄舌,又懂战场厮杀。
    chogath
        5
    chogath  
    OP
       2021-05-17 11:43:04 +08:00
    @Dogtler 足下才智 与我暗合。
    eijnix
        6
    eijnix  
       2021-05-17 12:41:17 +08:00 via iPhone
    我们组用的是 facebook 的 inject go 还可以,不过这个项目已经停止维护了
    zjsxwc
        7
    zjsxwc  
       2021-05-17 12:44:03 +08:00
    golang
    依赖注入容器 https://github.com/facebookarchive/inject
    web 框架无脑 beego
    SorcererXW
        8
    SorcererXW  
       2021-05-17 13:00:06 +08:00
    推荐 https://github.com/google/wire , 自己写各种 provider, 然后在编译器生成整个注入链路, 不和 web 框架绑定起来, 可以使用任何 web 框架
    chogath
        9
    chogath  
    OP
       2021-05-17 13:23:34 +08:00
    @eijnix 感谢
    chogath
        10
    chogath  
    OP
       2021-05-17 13:23:49 +08:00
    @zjsxwc 好的,感谢
    chogath
        11
    chogath  
    OP
       2021-05-17 13:24:33 +08:00
    @SorcererXW 好滴,我试下,这个玩法我还挺感兴趣的
    evilgod528
        12
    evilgod528  
       2021-05-17 13:31:41 +08:00
    @SorcererXW #8 推荐
    charlie21
        13
    charlie21  
       2021-05-17 15:43:11 +08:00 via iPhone
    前端 angular 框架那种的搞个什么东西都搞个依赖注入来降低复杂度
    FreeEx
        14
    FreeEx  
       2021-05-17 15:55:30 +08:00
    go 下面的依赖注入不太好用,不过由于 go 的特性,在同一个包下面的变量在不同的 go 文件里面可以互相引用,所以只需要手动初始化一次即可不限量使用。

    你可以看下我的这个项目 https://github.com/dushixiang/next-terminal
    我也是在摸索 go 的写法
    AppxLite
        15
    AppxLite  
       2021-05-17 15:56:31 +08:00
    echo
    chogath
        16
    chogath  
    OP
       2021-05-17 15:58:44 +08:00
    @FreeEx 感谢您的分享
    TuringGunner
        17
    TuringGunner  
       2021-05-17 16:00:55 +08:00
    手动 wire 吧,貌似没有啥特别靠谱的
    chogath
        18
    chogath  
    OP
       2021-05-17 16:04:09 +08:00
    @TuringGunner 好的,感谢 💛
    king888
        19
    king888  
       2021-05-17 16:15:27 +08:00
    iris 自带依赖注入 https://github.com/kataras/iris/wiki/dependency-injection
    endure 也可以实现依赖注入,但是偏应用相关 https://github.com/spiral/endure
    king888
        20
    king888  
       2021-05-17 16:17:48 +08:00
    iris 补充一下,最近作者有些蛇王,进度更严重,只 commit 捐助名单,但是不影响使用
    endure 老毛子的东西,响应比较及时
    chogath
        21
    chogath  
    OP
       2021-05-17 16:20:14 +08:00
    @king888 好嘞
    king888
        22
    king888  
       2021-05-17 16:22:40 +08:00
    @chogath reflect 包用熟悉点,自己也可也搞个依赖注入,容器这个实现不难
    chogath
        23
    chogath  
    OP
       2021-05-17 16:29:26 +08:00
    @king888 是,现有的包够用了,功能都可以自己搭。但是并非是最佳实践。说白了大家也都还在探索中。。
    lgpqdwjh
        24
    lgpqdwjh  
       2021-05-17 16:34:47 +08:00
    windyboy
        25
    windyboy  
       2021-05-17 17:06:10 +08:00
    善意提醒,不需要玩 go web 的时候用 spring 的思想
    zjsxwc
        26
    zjsxwc  
       2021-05-17 17:10:59 +08:00
    @zjsxwc
    这个依赖注入容器更简单直观,和 requirejs 一样的注入方式

    https://github.com/golobby/container
    zoharSoul
        27
    zoharSoul  
       2021-05-17 18:09:46 +08:00   ❤️ 3
    @windyboy #25 依赖注入什么时候是 spring 的思想了...
    ReferenceE
        28
    ReferenceE  
       2021-05-17 18:10:28 +08:00 via Android
    BeautifulSoap
        29
    BeautifulSoap  
       2021-05-17 19:29:53 +08:00   ❤️ 1
    DI 框架并不算是 spring 思维,作为减轻开发时心智负担的工具,DI 是真的挺重要的。如果真不重要的话 google 官方也不会亲自下场写 wire 这种工具了

    go 的 DI 目前用过觉得靠谱的 DI 框架有两个:

    1. wire 谷歌官方的 DI 工具。因为其他的 DI 库基本都是基于反射,性能不行,所以谷歌自己写了个这个基于代码生成的 DI,没有任何性能损失。wire 应该是目前 go 语言中关于 DI 最知名用的最广的一个工具了吧。但是问题在于,wire 是基于代码生成的,所以意味着每次你改动依赖都必须重新生成代码,虽然可以用 go generate,但还是挺麻烦的,尤其有时候你自己都不知道改了依赖,忘了生成代码程序就会出错(当然挺多错误能在编译阶段发现也算是个优点)

    2. https://github.com/uber-go/dig Uber 的基于反射的 DI 。好处自然是动态 DI,不用总生成代码,但因为基于反射,性能不行,所以 Uber 官方也建议只在 app 初始化的时候使用。目前项目里用的就是 dig,在初始化和测试的时候用 dig 做依赖注入,非常舒服
    BeautifulSoap
        30
    BeautifulSoap  
       2021-05-17 19:36:29 +08:00
    @BeautifulSoap 再补个 wire 的问题。因为 wire 是代码生成,所以团队开发的时候,自动生成的代码经常(是的,经常)出现 git 的代码合并冲突。我加了依赖,同事加了依赖,即便这两个依赖毫无关系也不对之前的代码有影响,生成的 wire_gen.go 也非常大的几率会合并失败。最终就是总要等一个人合并完成之后,再引入新代码,再生成一遍。真的是不厌其烦。当然一个解决办法就是彻底不提交 wire_gen.go ,每次测试或编译的时候执行 go generate 再生成临时的 wire_gen.go
    beidounanxizi
        31
    beidounanxizi  
       2021-05-17 22:13:56 +08:00
    JAVA 写多了 就有这个问题
    觉得 aop ioc di 很重要
    能把 JAVA 从一开始写好的人 少之又少

    既然写 go 建议多看看 go 吧
    fxjson
        32
    fxjson  
       2021-05-18 08:00:42 +08:00 via Android
    借楼问下各位,go log 里面添加 request id 怎么搞,包括 service 日志,gorm 日志等,不想 service,dao 层参数都加 Context 传递
    102400
        33
    102400  
       2021-05-18 10:55:28 +08:00
    @fxjson 中间件啊,在 Logger 中间件前面放个 SetRequestID
    chogath
        34
    chogath  
    OP
       2021-05-18 10:58:02 +08:00
    @fxjson 切面,interceptor 里实现
    joesonw
        35
    joesonw  
       2021-05-18 12:47:57 +08:00
    https://github.com/go-macaron/macaron 可以动态注入 (反射).
    joesonw
        36
    joesonw  
       2021-05-18 12:48:45 +08:00
    @BeautifulSoap https://github.com/uber-go/fx, 在 dig 基础上包了一层, 用起来更爽.
    x940727
        37
    x940727  
       2021-05-18 14:59:11 +08:00
    @beidounanxizi 这和什么语言无关,这和项目大小有关……你自己看看 kubernetes 有没有类似 spring 的容器对象?
    beidounanxizi
        38
    beidounanxizi  
       2021-05-18 18:20:51 +08:00
    @x940727 K8S 不太了解 不过好奇 你能给个具体例子么 ?
    x940727
        39
    x940727  
       2021-05-18 19:30:14 +08:00
    staging/src/k8s.io/cloud-provider/app/controllermanager.go 比如这个像不像 ServletWebServerApplicationContext?
    staging/src/k8s.io/controller-manager/app/controllercontext.go 比如这个像不像 AbstractApplicationContext ?
    beidounanxizi
        40
    beidounanxizi  
       2021-05-21 01:07:29 +08:00
    @x940727 AOP IOC DI 在你说额的几个 go 这里 如果体现呢?
    你觉得这些 context 或者 manager 是软件工程的角色抽象啊
    JAVA Spring 的 AOP IOC DI 不知道你理解的是什么意思?
    AOP 是面向切面编程,动态 /静态编译 , IOC 是 bean 的注入实例化和管理
    都没有用反射, 再多是 function programming
    beidounanxizi
        41
    beidounanxizi  
       2021-05-21 01:15:22 +08:00
    @x940727

    你不能说 applicationcontext 和 controllercontext 相似 就是相同吧

    而且 go 自带的 context 和 JAVA spring 的 context 差十万八千里
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2756 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:02 · PVG 21:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.