大家有没有见过没有使用依赖注入的复杂 Go 开源项目

36 天前
 matrix1010

最近打算把公司的项目重构为使用依赖注入初始化所有服务(现在是每次需要某个依赖就内部 New 一个), 想找一些开源项目作为例子。但是简单找了找都是自动/手动进行依赖注入的,大家有没有见过 没有 使用依赖注入的:

5873 次点击
所在节点    Go 编程语言
95 条回复
FarmerChillax
36 天前
@matrix1010 如果你问的是「依赖注入」,那么基本可以说没有任何一个 Go 项目不使用依赖注入。因为依赖注入遍布了基本所有常用的基础包中。
james122333
36 天前
@pkoukk

真要在该方法定义参数其实写在方法内就可以了
Orenoid
36 天前
@zhady009 可能那些人是先通过 Spring 全家桶接触到的这个概念,所以以为依赖注入是 Java 特有的东西
povsister
36 天前
wire 先不说,fx 已经是我这边准备放进黑名单的东西。除了写 php 的那帮人转 go 用的很舒服外,正常人看到 fx 这玩意都觉得逆天
yplam
36 天前
我们的做法是

1. 基础包参考标准库 http 的实现,在容器初始化前配置,

2. 容器实例化代码手写,除了基础包的以外全部功能都要按依赖注入的模式实例化,

3. 其他更上层的包就直接通过容器拿

4. 用独立包定义 interface ,避免循环依赖
FalconD
36 天前
总不能把 MonadT RWST 叫做依赖注入吧
@Orenoid
sophos
36 天前
@james122333 关于依赖关系这个痛点问题,这个依赖注入框架就特别支持了生成依赖拓扑 :-)

跑 kod callgraph 命令,就能生成指定二进制程序内部的模块依赖拓扑

https://github.com/go-kod/kod-mono?tab=readme-ov-file#callgraph-auto-generated

顺便补充一下,依赖注入并不局限在某个语言,而是一种编程范式。
依赖注入框架则是按照约定的规则,自动将依赖注入到各个模块,只是局限于 Go 语言的表达力,目前主流的框架还不够好用。

我在 https://github.com/go-kod/kod 中基于代码生成和泛型,简化了自动注入的约定规则,同时规范了 interface 声明和 mock 生成,对于频繁迭代的业务项目来说,应该可以极大提高开发效率 :-)

更进一步,还能支持面向切面编程,很方便自己实现各种 Interceptor ,引入类似链路追踪、监控、熔断、限速之类的功能,业务无代码侵入且不局限于某种特定框架
james122333
36 天前
@sophos

这就过于複杂了 还要多余工具
面向切面编程与拦截器都是
显式流程呼叫更为简单 函式切的够整齐与其效果无异
zjsxwc
36 天前
@RayR 对,我说的就是这个规则,go 规范里面给出了按照包依赖关系深度优先执行 init ,所以只要负责自己包内部的 init 依赖注入就完事了,
你为什么要去干涉别的包的 init ?
james122333
36 天前
@povsister

看了一下 fx 还更好点 编译器检查总比打错字不知好
lt0136
36 天前
https://github.com/temporalio/temporal
用了 uber/fx ,有完善的测试
lt0136
36 天前
@lt0136 没认真审题😂忽略
changz
36 天前
不喜欢依赖注入就手工管理呗,但评论区里说的通过 init 方法全局单例在大部分时候最终都会变成一坨翔
james122333
36 天前
@changz

我都没在用 init 不过 init 确实在某些情况不错
我更常直接

var Abc = func() XXX {
...
return XXX
}()

var Bcd = func() YYY {
...
return YYY
}()
nuffin
36 天前
@matrix1010 你既然知道,又想知道答案,为什么不描述清晰一些呢?最简单的 *不* 也行啊
eijnix
36 天前
业务复杂了之后还是很适合用依赖注入的,我们公司内部从头开发了一套依赖注入框架,我们小组之前用的是 facebook 的那个 inject
nuffin
36 天前
仔细的看了一遍回复(当然有 link 的我还没仔细去看),我作为一个 C 程序员……想问问,依赖注入是啥?单例就全局变量,事务相关就 *alloc 创建一个,也类似写个 NewXxx 方法。其实主要还是看业务导向,和实现复杂度的匹配。

我觉得 OP 想清楚匹配度,作为评估依据就可以了,市面上用的多的方案未必是适合你们项目的。
lesismal
36 天前
十几年来研究了好几次什么是依赖注入, 今天又研究了下, 至今没搞明白到底什么是依赖注入...
matrix1010
36 天前
@lesismal 依赖注入其实是符合直觉的,因此专门尝试去理解反而比较困难。前面有人说的在 init 里初始化服务就属于非依赖注入的做法,但这么做的开源项目肯定是极少数,因为复杂的大型开源项目肯定是多人协同开发,那项目结构也要达成共识,而多人共识最有可能的就是使用认可度最高的依赖注入模式
rickiey
36 天前
@aloxaf #36 哈哈,缘分呐,不过我刚已经从 FIL 矿商离职了,入交易所了,不得不说挖矿确实好,躺着靠机器赚钱,可惜啊,都没有矿能一直好好挖下去,filecoin 已经算是比较好的了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1094915

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX