1
- # Dix - 现代化 Go 依赖注入框架
2
-
3
- [ ![ Go Version] ( https://img.shields.io/badge/go-%3E%3D1.18-blue.svg )] ( https://golang.org/ )
4
- [ ![ License] ( https://img.shields.io/badge/license-Apache%202.0-green.svg )] ( LICENSE )
1
+ [ ![ Go Doc] ( https://godoc.org/github.com/pubgo/dix?status.svg )] ( https://godoc.org/github.com/pubgo/dix )
2
+ [ ![ Build Status] ( https://travis-ci.com/pubgo/dix.svg?branch=master )] ( https://travis-ci.com/pubgo/dix )
5
3
[ ![ Go Report Card] ( https://goreportcard.com/badge/github.com/pubgo/dix )] ( https://goreportcard.com/report/github.com/pubgo/dix )
6
- [ ![ Coverage Status] ( https://coveralls.io/repos/github/pubgo/dix/badge.svg )] ( https://coveralls.io/github/pubgo/dix )
7
4
8
- ** Dix** 是一个现代化的 Go 依赖注入框架,采用模块化架构设计,提供类型安全的泛型 API 和高性能的依赖管理能力。
5
+ # Dix - 现代化的 Go 依赖注入框架
9
6
10
- ## ✨ 特性
7
+ ## 🎯 核心设计理念
11
8
12
- ### 🚀 现代化设计
13
- - ** 泛型支持** :完全的 Go 1.18+ 泛型 API,编译时类型安全
14
- - ** 模块化架构** :清晰的分层设计,易于扩展和维护
15
- - ** 零反射** :高性能实现,避免运行时反射开销
16
- - ** 函数式 API** :简洁直观的函数式接口设计
9
+ Dix 采用** 统一的 Inject 方法设计** ,通过单一接口支持多种依赖注入模式:
17
10
18
- ### 🔧 强大功能
19
- - ** 循环依赖检测** :智能检测和报告循环依赖问题
20
- - ** 多种注入方式** :支持构造函数、结构体字段、方法注入
21
- - ** 灵活提供者** :支持函数、值、接口等多种提供者类型
22
- - ** 命名空间隔离** :支持多容器实例,避免全局状态污染
11
+ - ✅ ** 函数注入** - 解析函数参数并调用
12
+ - ✅ ** 结构体注入** - 注入到结构体字段
13
+ - ✅ ** 方法注入** - 自动调用 DixInject 前缀方法
14
+ - ✅ ** 获取依赖实例** - 通过函数参数获取依赖实例
23
15
24
- ### 📊 高性能
25
- - ** 预编译优化** :依赖图预编译,运行时零开销
26
- - ** 内存池化** :智能内存管理,减少 GC 压力
27
- - ** 并发安全** :线程安全的容器操作
28
- - ** 懒加载** :按需实例化,优化启动性能
16
+ > ** 设计优势** : ` Inject ` 方法的入参可以是函数、指针、接口、map、list 等,** 一个方法涵盖所有依赖注入需求** ,提供更加统一和灵活的 API。
29
17
30
18
## 🚀 快速开始
31
19
35
23
go get github.com/pubgo/dix
36
24
```
37
25
38
- ### 基础用法
26
+ ### 基本用法
39
27
40
28
``` go
41
29
package main
@@ -45,7 +33,6 @@ import (
45
33
" github.com/pubgo/dix"
46
34
)
47
35
48
- // 定义接口和实现
49
36
type Logger interface {
50
37
Log (msg string )
51
38
}
@@ -73,14 +60,24 @@ func main() {
73
60
return &UserService{Logger: logger}
74
61
})
75
62
76
- // 获取实例(泛型 API)
77
- service := dix.MustGet [*UserService](container)
63
+ // 方式1: 结构体注入
64
+ var service UserService
65
+ dix.Inject (container, &service)
78
66
service.Logger .Log (" Hello, Dix!" )
79
67
80
- // 或者使用依赖注入
81
- var injectedService UserService
82
- dix.Inject (container, &injectedService)
83
- injectedService.Logger .Log (" Hello from injection!" )
68
+ // 方式2: 函数注入
69
+ dix.Inject (container, func (service *UserService) {
70
+ service.Logger .Log (" Hello from function injection!" )
71
+ })
72
+
73
+ // 方式3: 获取依赖实例的用法
74
+ var logger Logger
75
+ var userService *UserService
76
+ dix.Inject (container, func (l Logger, us *UserService) {
77
+ logger = l
78
+ userService = us
79
+ })
80
+ logger.Log (" Hello from unified injection!" )
84
81
}
85
82
```
86
83
@@ -103,9 +100,17 @@ func main() {
103
100
return &UserService{Logger: logger}
104
101
})
105
102
106
- // 直接获取实例
107
- service := dixglobal.Get [*UserService]()
108
- service.Logger .Log (" Hello from global container!" )
103
+ // 统一的注入方式
104
+ dixglobal.Inject (func (service *UserService) {
105
+ service.Logger .Log (" Hello from global container!" )
106
+ })
107
+
108
+ // 获取依赖实例的用法
109
+ var service *UserService
110
+ dixglobal.Inject (func (s *UserService) {
111
+ service = s
112
+ })
113
+ service.Logger .Log (" Got service via injection!" )
109
114
}
110
115
```
111
116
@@ -114,7 +119,7 @@ func main() {
114
119
### 核心文档
115
120
- [ 📖 API 文档] ( docs/API.md ) - 完整的 API 参考和使用示例
116
121
- [ 🏗️ 架构设计] ( docs/ARCHITECTURE.md ) - 深入了解框架架构和设计理念
117
- - [ 🔄 迁移指南] ( docs/MIGRATION.md ) - 从旧版本迁移到 v2.0 的详细指南
122
+ - [ 🔄 迁移指南] ( docs/MIGRATION.md ) - 从旧版本迁移的详细指南
118
123
- [ 📋 更新日志] ( docs/CHANGELOG.md ) - 版本更新历史和变更记录
119
124
120
125
### 示例代码
@@ -155,13 +160,23 @@ dix.Provide(container, func(db Database, logger Logger) *UserService {
155
160
dix.Provide (container, &Config{Port: 8080 })
156
161
```
157
162
158
- ### 注入方式
163
+ ### 统一的注入方式
159
164
160
- #### 1. 泛型获取 (推荐)
165
+ #### 1. 函数注入 (推荐)
161
166
``` go
162
- // 类型安全的实例获取
163
- logger := dix.MustGet [Logger](container)
164
- service , err := dix.Get [*UserService](container)
167
+ // 直接使用依赖
168
+ dix.Inject (container, func (db Database , logger Logger ) {
169
+ // 使用注入的依赖
170
+ logger.Log (" Database connected" )
171
+ })
172
+
173
+ // 获取依赖实例的用法
174
+ var logger Logger
175
+ var service *UserService
176
+ dix.Inject (container, func (l Logger , s *UserService) {
177
+ logger = l // 获取 Logger 实例
178
+ service = s // 获取 UserService 实例
179
+ })
165
180
```
166
181
167
182
#### 2. 结构体注入
@@ -175,12 +190,24 @@ var handler Handler
175
190
dix.Inject (container, &handler)
176
191
```
177
192
178
- #### 3. 函数注入
193
+ #### 3. 方法注入
179
194
``` go
180
- dix.Inject (container, func (db Database , logger Logger ) {
181
- // 使用注入的依赖
182
- logger.Log (" Database connected" )
183
- })
195
+ type Service struct {
196
+ logger Logger
197
+ db Database
198
+ }
199
+
200
+ // DixInject 前缀的方法会被自动调用
201
+ func (s *Service ) DixInjectLogger (logger Logger ) {
202
+ s.logger = logger
203
+ }
204
+
205
+ func (s *Service ) DixInjectDatabase (db Database ) {
206
+ s.db = db
207
+ }
208
+
209
+ var service Service
210
+ dix.Inject (container, &service)
184
211
```
185
212
186
213
## 🔧 高级特性
@@ -192,8 +219,10 @@ dix.Inject(container, func(db Database, logger Logger) {
192
219
dix.Provide (container, func (b B ) A { return A {} })
193
220
dix.Provide (container, func (a A ) B { return B {} })
194
221
195
- // 获取时会报告循环依赖错误
196
- _ , err := dix.Get [A](container)
222
+ // 注入时会报告循环依赖错误
223
+ err := dix.Inject (container, func (a A ) {
224
+ // 这里会触发循环依赖错误
225
+ })
197
226
// err: circular dependency detected: A -> B -> A
198
227
```
199
228
@@ -205,8 +234,12 @@ dix.Provide(container, func() Handler { return &HTTPHandler{} })
205
234
dix.Provide (container, func () Handler { return &GRPCHandler{} })
206
235
207
236
// 获取所有实例
208
- handlers := dix.MustGet [[]Handler ](container)
209
- fmt.Printf (" Registered %d handlers\n " , len (handlers))
237
+ dix.Inject (container, func (handlers []Handler ) {
238
+ fmt.Printf (" Registered %d handlers\n " , len (handlers))
239
+ for i , handler := range handlers {
240
+ fmt.Printf (" Handler %d : %T \n " , i, handler)
241
+ }
242
+ })
210
243
```
211
244
212
245
### 映射注入
@@ -217,102 +250,64 @@ dix.Provide(container, func() Handler { return &HTTPHandler{} })
217
250
dix.Provide (container, func () Handler { return &GRPCHandler{} })
218
251
219
252
// 获取映射
220
- handlerMap := dix.MustGet [map [string ]Handler](container)
221
- for name , handler := range handlerMap {
222
- fmt.Printf (" Handler %s : %T \n " , name, handler)
223
- }
253
+ dix.Inject (container, func (handlerMap map [string ]Handler) {
254
+ for name , handler := range handlerMap {
255
+ fmt.Printf (" Handler %s : %T \n " , name, handler)
256
+ }
257
+ })
224
258
```
225
259
226
260
### 依赖图可视化
227
261
228
262
``` go
229
263
// 查看依赖关系图
230
264
graph := dix.GetGraph (container)
231
- fmt.Printf (" Providers: %s \n " , graph.Providers )
232
- fmt.Printf (" Objects: %s \n " , graph.Objects )
233
- ```
234
-
235
- ## 🏗️ 架构层次
236
-
237
- Dix 采用分层架构设计:
238
-
239
- ```
240
- ┌─────────────────────────────────────┐
241
- │ Public API │ ← dix 包:用户友好的 API
242
- ├─────────────────────────────────────┤
243
- │ Global Container │ ← dixglobal 包:全局容器
244
- ├─────────────────────────────────────┤
245
- │ Internal Core │ ← dixinternal 包:核心实现
246
- └─────────────────────────────────────┘
265
+ fmt.Printf (" Providers:\n %s \n " , graph.Providers )
266
+ fmt.Printf (" Objects:\n %s \n " , graph.Objects )
247
267
```
248
268
249
- ### API 层次选择
250
-
251
- - ** 简单应用** :使用 ` dixglobal ` 包的全局容器
252
- - ** 复杂应用** :使用 ` dix ` 包的容器实例
253
- - ** 库开发** :使用 ` dixinternal ` 包的底层 API
254
-
255
- ## 🚀 性能优势
256
-
257
- ### v2.0 vs v1.x 性能对比
269
+ ## 📋 API 对比
258
270
259
- | 指标 | v1.x | v2.0 | 改进 |
260
- | ------| ------| ------| ------|
261
- | ** 代码行数** | 1,200+ | 373 | -69% |
262
- | ** 内存使用** | 基准 | -30% | 更少内存分配 |
263
- | ** 启动时间** | 基准 | -40% | 预编译优化 |
264
- | ** 运行时性能** | 基准 | +25% | 零反射实现 |
271
+ ### 统一设计的优势
265
272
266
- ### 优化特性
267
-
268
- - ** 预编译依赖图** :启动时构建,运行时零开销
269
- - ** 类型缓存** :避免重复类型解析
270
- - ** 内存池化** :减少 GC 压力
271
- - ** 并发优化** :线程安全的高效实现
272
-
273
- ## 🔄 迁移指南
274
-
275
- 从 v1.x 迁移到 v2.0?查看我们的[ 详细迁移指南] ( docs/MIGRATION.md ) 。
276
-
277
- ### 主要 API 变化
278
-
279
- | v1.x | v2.0 |
280
- | ------| ------|
281
- | ` dix.NewDix() ` | ` dix.New() ` |
282
- | ` container.Provide(fn) ` | ` dix.Provide(container, fn) ` |
273
+ | 传统方式 | Dix 统一方式 |
274
+ | ---------| -------------|
275
+ | ` container.Get(&target) ` | ` dix.Inject(container, func(t Target) { target = t }) ` |
283
276
| ` container.Inject(target) ` | ` dix.Inject(container, target) ` |
284
- | ` container.Get(&target ) ` | ` dix.Get[T] (container) ` |
277
+ | ` container.Call(fn ) ` | ` dix.Inject (container, fn ) ` |
285
278
286
- ## 🤝 贡献
279
+ ** 统一的 Inject 方法支持:**
280
+ - ✅ 函数:` func(deps...) { ... } `
281
+ - ✅ 结构体指针:` &struct{} `
282
+ - ✅ 接口类型:` interface{} `
283
+ - ✅ 切片类型:` []T `
284
+ - ✅ 映射类型:` map[string]T `
287
285
288
- 我们欢迎社区贡献!请查看 [ CONTRIBUTING.md ] ( CONTRIBUTING.md ) 了解如何参与项目开发。
286
+ ## 🌟 特性亮点
289
287
290
- ### 开发环境
288
+ - ** 🎯 统一 API** : 一个 ` Inject ` 方法处理所有依赖注入场景
289
+ - ** 🔒 类型安全** : 编译时类型检查,运行时错误详细
290
+ - ** ⚡ 高性能** : 优化的依赖解析和缓存机制
291
+ - ** 🔍 循环检测** : 自动检测和报告循环依赖
292
+ - ** 📊 可视化** : 依赖关系图生成和分析
293
+ - ** 🧩 模块化** : 清晰的架构分层和组件解耦
294
+ - ** 🛡️ 错误友好** : 详细的错误信息和调试支持
291
295
292
- ``` bash
293
- # 克隆项目
294
- git clone https://github.com/pubgo/dix.git
295
- cd dix
296
-
297
- # 安装依赖
298
- go mod tidy
296
+ ## 💡 设计思路
299
297
300
- # 运行测试
301
- go test ./...
298
+ Dix 的核心设计理念是** 简化和统一** :
302
299
303
- # 运行示例
304
- go run example/basic/main.go
305
- ```
300
+ 1 . ** 统一接口** : ` Inject ` 方法可以处理所有类型的依赖注入需求
301
+ 2 . ** 类型灵活** : 支持函数、指针、接口、集合等多种类型
302
+ 3 . ** 功能全面** : 既能注入依赖,也能获取实例,满足所有需求
303
+ 4 . ** 使用简单** : 学习成本低,API 直观易懂
306
304
307
- ## 📄 许可证
305
+ 这种设计让开发者只需要掌握一个方法,就能处理所有的依赖注入场景,大大简化了框架的使用复杂度。
308
306
309
- 本项目采用 [ Apache 2.0 许可证] ( LICENSE ) 。
310
-
311
- ## 🙏 致谢
307
+ ## 🤝 贡献
312
308
313
- - 设计灵感来源于 [ uber-go/dig] ( https://github.com/uber-go/dig )
314
- - 感谢所有贡献者的支持和反馈
309
+ 欢迎提交 Issue 和 Pull Request!
315
310
316
- ---
311
+ ## �� 许可证
317
312
318
- ** Dix ** - 让依赖注入变得简单而强大 🚀
313
+ MIT License
0 commit comments