Golang Go语言上的 DI 有什么比较好的解决方案
Golang Go语言上的 DI 有什么比较好的解决方案
如题^ 目前看过 dig 和 wire,有人用过吗?有什么坑分享一下。
直接写依赖注入不好吗 di 这个缩写也太模糊了
还好我回复的慢,差点把 DI 当成 CI 了。
facebook 也有个 inject 库
手动构造函数注入不用库
用 go 去用依赖注入?问号脸。。。
选择用 go 就是为了追求更高的性能。所以不用依赖注入。
dig 是用反射实现的,其实还行
wire 是代码生成的,如果不是很复杂的项目,代码生成不如手工写了
我也想了一下 要不是提到了 wire 我也以为是 ci 的什么变种
有没有基于 xml 文件的注入?
wire 的方式看起来不爽啊
建议换成 Java
还以为在说数据智能╮( ̄▽ ̄"")╭
依赖注入和性能有什么关系?
依赖注入有啥影响性能的……大部分启动时候扫一下就行了
官方博客都教你用 wire,有什么问题?
go 的依赖注入( dig )用的反射实现的,反射性能不佳。
当然,你要是能做到只在程序初始加载时做一次注入,那就无所谓了。
出门左转是 java … go 需要啥依赖注入…
如果不用 xml 配置注入的话,用注解注入我也喜欢。
发现这个 facebook 的项目,它通过注解来注入比 wire 那种手动写一堆 NewXXXXX 函数来注入更自然:
https://github.com/facebookgo/inject
在Golang(Go语言)中,依赖注入(DI)是一种重要的设计模式,用于实现代码的解耦和增强模块间的灵活性。针对Go语言上的DI,以下是一些比较好的解决方案:
-
手动注入:
- 适用于小型项目或模块间依赖关系简单的情况。
- 通过构造函数、方法参数等方式显式传递依赖。
-
使用第三方库:
- Wire:由Google开源的依赖注入框架,通过代码生成的方式提供高效的依赖注入解决方案。Wire通过编写注入代码模板,在编译时生成具体的依赖注入逻辑,从而避免了运行时的性能开销。
- Uber的Dig:一个轻量级的依赖注入容器,支持反射和代码生成两种方式,提供了灵活的依赖注入和解析功能。
- Facebook的Inject:虽然不如Wire和Dig那样流行,但也是一个可选的依赖注入库。
-
使用接口和服务容器:
- 定义接口来抽象依赖关系,然后通过服务容器(如自定义的结构体或第三方库提供的容器)来管理和注入这些依赖。
-
利用Go的模块系统:
- Go的模块系统(go mod)虽然主要用于依赖管理,但也可以在一定程度上辅助实现DI,通过模块间的显式依赖关系来组织代码。
综上所述,选择哪种DI解决方案取决于项目的规模、复杂度以及开发团队的具体需求。