Skip to content

Commit 669ef36

Browse files
committed
fix: barry quick fix, 2025-06-07 13:44:44
1 parent e257e0e commit 669ef36

File tree

22 files changed

+631
-1606
lines changed

22 files changed

+631
-1606
lines changed

README.md

Lines changed: 119 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,19 @@
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)
53
[![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)
74

8-
**Dix** 是一个现代化的 Go 依赖注入框架,采用模块化架构设计,提供类型安全的泛型 API 和高性能的依赖管理能力。
5+
# Dix - 现代化的 Go 依赖注入框架
96

10-
## ✨ 特性
7+
## 🎯 核心设计理念
118

12-
### 🚀 现代化设计
13-
- **泛型支持**:完全的 Go 1.18+ 泛型 API,编译时类型安全
14-
- **模块化架构**:清晰的分层设计,易于扩展和维护
15-
- **零反射**:高性能实现,避免运行时反射开销
16-
- **函数式 API**:简洁直观的函数式接口设计
9+
Dix 采用**统一的 Inject 方法设计**,通过单一接口支持多种依赖注入模式:
1710

18-
### 🔧 强大功能
19-
- **循环依赖检测**:智能检测和报告循环依赖问题
20-
- **多种注入方式**:支持构造函数、结构体字段、方法注入
21-
- **灵活提供者**:支持函数、值、接口等多种提供者类型
22-
- **命名空间隔离**:支持多容器实例,避免全局状态污染
11+
-**函数注入** - 解析函数参数并调用
12+
-**结构体注入** - 注入到结构体字段
13+
-**方法注入** - 自动调用 DixInject 前缀方法
14+
-**获取依赖实例** - 通过函数参数获取依赖实例
2315

24-
### 📊 高性能
25-
- **预编译优化**:依赖图预编译,运行时零开销
26-
- **内存池化**:智能内存管理,减少 GC 压力
27-
- **并发安全**:线程安全的容器操作
28-
- **懒加载**:按需实例化,优化启动性能
16+
> **设计优势**: `Inject` 方法的入参可以是函数、指针、接口、map、list 等,**一个方法涵盖所有依赖注入需求**,提供更加统一和灵活的 API。
2917
3018
## 🚀 快速开始
3119

@@ -35,7 +23,7 @@
3523
go get github.com/pubgo/dix
3624
```
3725

38-
### 基础用法
26+
### 基本用法
3927

4028
```go
4129
package main
@@ -45,7 +33,6 @@ import (
4533
"github.com/pubgo/dix"
4634
)
4735

48-
// 定义接口和实现
4936
type Logger interface {
5037
Log(msg string)
5138
}
@@ -73,14 +60,24 @@ func main() {
7360
return &UserService{Logger: logger}
7461
})
7562

76-
// 获取实例(泛型 API)
77-
service := dix.MustGet[*UserService](container)
63+
// 方式1: 结构体注入
64+
var service UserService
65+
dix.Inject(container, &service)
7866
service.Logger.Log("Hello, Dix!")
7967

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!")
8481
}
8582
```
8683

@@ -103,9 +100,17 @@ func main() {
103100
return &UserService{Logger: logger}
104101
})
105102

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!")
109114
}
110115
```
111116

@@ -114,7 +119,7 @@ func main() {
114119
### 核心文档
115120
- [📖 API 文档](docs/API.md) - 完整的 API 参考和使用示例
116121
- [🏗️ 架构设计](docs/ARCHITECTURE.md) - 深入了解框架架构和设计理念
117-
- [🔄 迁移指南](docs/MIGRATION.md) - 从旧版本迁移到 v2.0 的详细指南
122+
- [🔄 迁移指南](docs/MIGRATION.md) - 从旧版本迁移的详细指南
118123
- [📋 更新日志](docs/CHANGELOG.md) - 版本更新历史和变更记录
119124

120125
### 示例代码
@@ -155,13 +160,23 @@ dix.Provide(container, func(db Database, logger Logger) *UserService {
155160
dix.Provide(container, &Config{Port: 8080})
156161
```
157162

158-
### 注入方式
163+
### 统一的注入方式
159164

160-
#### 1. 泛型获取(推荐)
165+
#### 1. 函数注入(推荐)
161166
```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+
})
165180
```
166181

167182
#### 2. 结构体注入
@@ -175,12 +190,24 @@ var handler Handler
175190
dix.Inject(container, &handler)
176191
```
177192

178-
#### 3. 函数注入
193+
#### 3. 方法注入
179194
```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)
184211
```
185212

186213
## 🔧 高级特性
@@ -192,8 +219,10 @@ dix.Inject(container, func(db Database, logger Logger) {
192219
dix.Provide(container, func(b B) A { return A{} })
193220
dix.Provide(container, func(a A) B { return B{} })
194221

195-
// 获取时会报告循环依赖错误
196-
_, err := dix.Get[A](container)
222+
// 注入时会报告循环依赖错误
223+
err := dix.Inject(container, func(a A) {
224+
// 这里会触发循环依赖错误
225+
})
197226
// err: circular dependency detected: A -> B -> A
198227
```
199228

@@ -205,8 +234,12 @@ dix.Provide(container, func() Handler { return &HTTPHandler{} })
205234
dix.Provide(container, func() Handler { return &GRPCHandler{} })
206235

207236
// 获取所有实例
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+
})
210243
```
211244

212245
### 映射注入
@@ -217,102 +250,64 @@ dix.Provide(container, func() Handler { return &HTTPHandler{} })
217250
dix.Provide(container, func() Handler { return &GRPCHandler{} })
218251

219252
// 获取映射
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+
})
224258
```
225259

226260
### 依赖图可视化
227261

228262
```go
229263
// 查看依赖关系图
230264
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)
247267
```
248268

249-
### API 层次选择
250-
251-
- **简单应用**:使用 `dixglobal` 包的全局容器
252-
- **复杂应用**:使用 `dix` 包的容器实例
253-
- **库开发**:使用 `dixinternal` 包的底层 API
254-
255-
## 🚀 性能优势
256-
257-
### v2.0 vs v1.x 性能对比
269+
## 📋 API 对比
258270

259-
| 指标 | v1.x | v2.0 | 改进 |
260-
|------|------|------|------|
261-
| **代码行数** | 1,200+ | 373 | -69% |
262-
| **内存使用** | 基准 | -30% | 更少内存分配 |
263-
| **启动时间** | 基准 | -40% | 预编译优化 |
264-
| **运行时性能** | 基准 | +25% | 零反射实现 |
271+
### 统一设计的优势
265272

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 })` |
283276
| `container.Inject(target)` | `dix.Inject(container, target)` |
284-
| `container.Get(&target)` | `dix.Get[T](container)` |
277+
| `container.Call(fn)` | `dix.Inject(container, fn)` |
285278

286-
## 🤝 贡献
279+
**统一的 Inject 方法支持:**
280+
- ✅ 函数:`func(deps...) { ... }`
281+
- ✅ 结构体指针:`&struct{}`
282+
- ✅ 接口类型:`interface{}`
283+
- ✅ 切片类型:`[]T`
284+
- ✅ 映射类型:`map[string]T`
287285

288-
我们欢迎社区贡献!请查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何参与项目开发。
286+
## 🌟 特性亮点
289287

290-
### 开发环境
288+
- **🎯 统一 API**: 一个 `Inject` 方法处理所有依赖注入场景
289+
- **🔒 类型安全**: 编译时类型检查,运行时错误详细
290+
- **⚡ 高性能**: 优化的依赖解析和缓存机制
291+
- **🔍 循环检测**: 自动检测和报告循环依赖
292+
- **📊 可视化**: 依赖关系图生成和分析
293+
- **🧩 模块化**: 清晰的架构分层和组件解耦
294+
- **🛡️ 错误友好**: 详细的错误信息和调试支持
291295

292-
```bash
293-
# 克隆项目
294-
git clone https://github.com/pubgo/dix.git
295-
cd dix
296-
297-
# 安装依赖
298-
go mod tidy
296+
## 💡 设计思路
299297

300-
# 运行测试
301-
go test ./...
298+
Dix 的核心设计理念是**简化和统一**
302299

303-
# 运行示例
304-
go run example/basic/main.go
305-
```
300+
1. **统一接口**: `Inject` 方法可以处理所有类型的依赖注入需求
301+
2. **类型灵活**: 支持函数、指针、接口、集合等多种类型
302+
3. **功能全面**: 既能注入依赖,也能获取实例,满足所有需求
303+
4. **使用简单**: 学习成本低,API 直观易懂
306304

307-
## 📄 许可证
305+
这种设计让开发者只需要掌握一个方法,就能处理所有的依赖注入场景,大大简化了框架的使用复杂度。
308306

309-
本项目采用 [Apache 2.0 许可证](LICENSE)
310-
311-
## 🙏 致谢
307+
## 🤝 贡献
312308

313-
- 设计灵感来源于 [uber-go/dig](https://github.com/uber-go/dig)
314-
- 感谢所有贡献者的支持和反馈
309+
欢迎提交 Issue 和 Pull Request!
315310

316-
---
311+
## �� 许可证
317312

318-
**Dix** - 让依赖注入变得简单而强大 🚀
313+
MIT License

0 commit comments

Comments
 (0)