类比:
1
SingeeKing 2021-05-17 11:24:14 +08:00
|
2
chogath OP 我很多年前刚开始工作的时候,也是非常抵制依赖注入的,不就几个构造器嘛,有必要引入重量级 spring 框架么,直到后来写了一个大型系统,系统初始化的时候把一堆对象接来接去非常繁琐,经常一个构造器里会有七八个对象,而这样的构造器又有几十个,项目看上去像一坨屎,改代码像挑大粪。然后后面使用了 spring,改造后整个系统都清爽无比,才对依赖注入产生了不一样的看法。我个人理解,依赖注入这种东西只有在大型系统里用过才有体会。
|
3
chogath OP @SingeeKing tks
|
4
Dogtler 2021-05-17 11:40:04 +08:00 1
有趣,你又懂鼓唇弄舌,又懂战场厮杀。
|
6
eijnix 2021-05-17 12:41:17 +08:00 via iPhone
我们组用的是 facebook 的 inject go 还可以,不过这个项目已经停止维护了
|
7
zjsxwc 2021-05-17 12:44:03 +08:00
|
8
SorcererXW 2021-05-17 13:00:06 +08:00
推荐 https://github.com/google/wire , 自己写各种 provider, 然后在编译器生成整个注入链路, 不和 web 框架绑定起来, 可以使用任何 web 框架
|
11
chogath OP @SorcererXW 好滴,我试下,这个玩法我还挺感兴趣的
|
12
evilgod528 2021-05-17 13:31:41 +08:00
@SorcererXW #8 推荐
|
13
charlie21 2021-05-17 15:43:11 +08:00 via iPhone
前端 angular 框架那种的搞个什么东西都搞个依赖注入来降低复杂度
|
14
FreeEx 2021-05-17 15:55:30 +08:00
go 下面的依赖注入不太好用,不过由于 go 的特性,在同一个包下面的变量在不同的 go 文件里面可以互相引用,所以只需要手动初始化一次即可不限量使用。
你可以看下我的这个项目 https://github.com/dushixiang/next-terminal 我也是在摸索 go 的写法 |
15
AppxLite 2021-05-17 15:56:31 +08:00
echo
|
17
TuringGunner 2021-05-17 16:00:55 +08:00
手动 wire 吧,貌似没有啥特别靠谱的
|
18
chogath OP @TuringGunner 好的,感谢 💛
|
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 |
20
king888 2021-05-17 16:17:48 +08:00
iris 补充一下,最近作者有些蛇王,进度更严重,只 commit 捐助名单,但是不影响使用
endure 老毛子的东西,响应比较及时 |
24
lgpqdwjh 2021-05-17 16:34:47 +08:00
|
25
windyboy 2021-05-17 17:06:10 +08:00
善意提醒,不需要玩 go web 的时候用 spring 的思想
|
26
zjsxwc 2021-05-17 17:10:59 +08:00
|
28
ReferenceE 2021-05-17 18:10:28 +08:00 via Android
C#之.NET
|
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 做依赖注入,非常舒服 |
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
|
31
beidounanxizi 2021-05-17 22:13:56 +08:00
JAVA 写多了 就有这个问题
觉得 aop ioc di 很重要 能把 JAVA 从一开始写好的人 少之又少 既然写 go 建议多看看 go 吧 |
32
fxjson 2021-05-18 08:00:42 +08:00 via Android
借楼问下各位,go log 里面添加 request id 怎么搞,包括 service 日志,gorm 日志等,不想 service,dao 层参数都加 Context 传递
|
35
joesonw 2021-05-18 12:47:57 +08:00
https://github.com/go-macaron/macaron 可以动态注入 (反射).
|
36
joesonw 2021-05-18 12:48:45 +08:00
@BeautifulSoap https://github.com/uber-go/fx, 在 dig 基础上包了一层, 用起来更爽.
|
37
x940727 2021-05-18 14:59:11 +08:00
@beidounanxizi 这和什么语言无关,这和项目大小有关……你自己看看 kubernetes 有没有类似 spring 的容器对象?
|
38
beidounanxizi 2021-05-18 18:20:51 +08:00
@x940727 K8S 不太了解 不过好奇 你能给个具体例子么 ?
|
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 ? |
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 |
41
beidounanxizi 2021-05-21 01:15:22 +08:00
@x940727
你不能说 applicationcontext 和 controllercontext 相似 就是相同吧 而且 go 自带的 context 和 JAVA spring 的 context 差十万八千里 |