Skip to content

Commit a06c730

Browse files
committed
fix: barry quick fix, 2025-06-07 14:40:41
1 parent 669ef36 commit a06c730

File tree

9 files changed

+68
-115
lines changed

9 files changed

+68
-115
lines changed

CHANGELOG.md

Lines changed: 0 additions & 51 deletions
This file was deleted.

dix.go

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package dix
22

33
import (
4+
"fmt"
5+
"github.com/pubgo/funk/errors"
6+
"reflect"
7+
48
"github.com/pubgo/dix/dixinternal"
5-
"github.com/pubgo/funk/assert"
69
)
710

811
const (
@@ -28,15 +31,12 @@ func New(opts ...Option) Container {
2831

2932
// Inject 统一的依赖注入方法
3033
//
31-
// 这是框架的核心方法,支持多种输入类型,提供了统一的依赖注入接口
32-
// 一个方法处理所有依赖注入需求,包括获取实例和注入依赖
34+
// 这是框架的核心方法,按照最原始的设计,只支持函数和结构体类型
35+
// 提供了统一的依赖注入接口,简化API设计
3336
//
3437
// 支持的输入类型:
3538
// - 函数:func(deps...) - 解析函数参数并调用函数
3639
// - 结构体指针:&struct{} - 注入到结构体字段
37-
// - 接口:interface{} - 支持接口类型注入
38-
// - 切片:[]T - 注入所有匹配的实例
39-
// - 映射:map[string]T - 注入带名称的实例
4040
//
4141
// 函数注入规则:
4242
// - 函数只能有入参,不能有出参
@@ -62,33 +62,44 @@ func New(opts ...Option) Container {
6262
//
6363
// 示例:
6464
//
65-
// // 函数注入(替代传统启动函数)
66-
// err := dix.Inject(container, func(logger Logger, db *Database, handlers []Handler) {
65+
// // 函数注入
66+
// _, err := dix.Inject(container, func(logger Logger, db *Database, handlers []Handler) {
6767
// // 使用注入的依赖启动服务器
6868
// startServer(logger, db, handlers)
6969
// })
70+
// if err != nil {
71+
// log.Fatal(err)
72+
// }
7073
//
7174
// // 结构体注入
7275
// type Service struct {
7376
// Logger Logger
7477
// DB *Database
7578
// }
76-
// var service Service
77-
// err := dix.Inject(container, &service)
79+
// service, err := dix.Inject(container, &Service{})
80+
// if err != nil {
81+
// log.Fatal(err)
82+
// }
7883
//
7984
// // 获取单个依赖实例
8085
// var logger Logger
81-
// err := dix.Inject(container, func(l Logger) {
86+
// _, err := dix.Inject(container, func(l Logger) {
8287
// logger = l
8388
// })
89+
// if err != nil {
90+
// log.Fatal(err)
91+
// }
8492
//
8593
// // 批量获取多个依赖实例
8694
// var logger Logger
8795
// var db *Database
8896
// var handlers []Handler
89-
// err := dix.Inject(container, func(l Logger, d *Database, h []Handler) {
97+
// _, err := dix.Inject(container, func(l Logger, d *Database, h []Handler) {
9098
// logger, db, handlers = l, d, h
9199
// })
100+
// if err != nil {
101+
// log.Fatal(err)
102+
// }
92103
//
93104
// // 方法注入示例
94105
// type UserService struct {
@@ -98,18 +109,33 @@ func New(opts ...Option) Container {
98109
// func (s *UserService) DixInjectLogger(logger Logger) { s.logger = logger }
99110
// func (s *UserService) DixInjectDatabase(db *Database) { s.db = db }
100111
//
101-
// var service UserService
102-
// err := dix.Inject(container, &service)
112+
// service, err := dix.Inject(container, &UserService{})
113+
// if err != nil {
114+
// log.Fatal(err)
115+
// }
103116
//
104117
// 参数:
105118
// - container: 依赖注入容器
106-
// - target: 注入目标(函数、结构体指针、接口等
119+
// - target: 注入目标(函数或结构体指针
107120
// - opts: 注入选项(可选)
108121
//
109122
// 返回值:
123+
// - T: 如果target是函数,返回零值(nil);如果是结构体,返回注入后的结构体
110124
// - error: 注入失败时的错误信息
111-
func Inject(container Container, target interface{}, opts ...Option) error {
112-
return container.Inject(target, opts...)
125+
func Inject[T any](container Container, target T, opts ...Option) (T, error) {
126+
vp := reflect.ValueOf(target)
127+
if vp.Kind() == reflect.Struct {
128+
if err := container.Inject(&target, opts...); err != nil {
129+
return target, fmt.Errorf("dix: inject failed: %w", err)
130+
}
131+
return target, nil
132+
} else {
133+
return target, container.Inject(target, opts...)
134+
}
135+
}
136+
137+
func InjectMust[T any](container Container, target T, opts ...Option) T {
138+
return errors.Must1(Inject(container, target, opts...))
113139
}
114140

115141
// Provide 注册依赖提供者
@@ -165,7 +191,7 @@ func Inject(container Container, target interface{}, opts ...Option) error {
165191
// - container: 依赖注入容器
166192
// - provider: 提供者函数
167193
func Provide(container Container, provider any) {
168-
assert.Must(container.Provide(provider))
194+
errors.Must(container.Provide(provider))
169195
}
170196

171197
// GetGraph 获取依赖关系图
@@ -174,7 +200,3 @@ func Provide(container Container, provider any) {
174200
func GetGraph(container Container) *Graph {
175201
return container.Graph()
176202
}
177-
178-
// 为了向后兼容,保留旧的类型别名
179-
// Deprecated: 使用 Container 替代
180-
type Dix = Container

dixglobal/global.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package dixglobal
22

33
import (
4+
"github.com/pubgo/funk/errors"
45
"reflect"
56

67
"github.com/pubgo/dix/dixinternal"
7-
"github.com/pubgo/funk/assert"
88
)
99

1010
var _container = dixinternal.New(dixinternal.WithValuesNull())
@@ -35,7 +35,7 @@ var _container = dixinternal.New(dixinternal.WithValuesNull())
3535

3636
// Provide registers an object constructor
3737
func Provide(provider any) {
38-
assert.Must(_container.Provide(provider))
38+
errors.Must(_container.Provide(provider))
3939
}
4040

4141
// Inject 统一的依赖注入方法
@@ -57,9 +57,9 @@ func Provide(provider any) {
5757
func Inject[T any](target T, opts ...dixinternal.Option) T {
5858
vp := reflect.ValueOf(target)
5959
if vp.Kind() == reflect.Struct {
60-
assert.Must(_container.Inject(&target, opts...))
60+
errors.Must(_container.Inject(&target, opts...))
6161
} else {
62-
assert.Must(_container.Inject(target, opts...))
62+
errors.Must(_container.Inject(target, opts...))
6363
}
6464
return target
6565
}

dixinternal/container.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -89,27 +89,6 @@ func (c *ContainerImpl) Inject(target interface{}, opts ...Option) error {
8989
return c.injector.InjectTarget(target, mergedOpts)
9090
}
9191

92-
// get 获取指定类型的实例(内部方法)
93-
func (c *ContainerImpl) get(typ reflect.Type, opts ...Option) (interface{}, error) {
94-
// 合并选项
95-
mergedOpts := c.options
96-
for _, opt := range opts {
97-
opt(&mergedOpts)
98-
}
99-
100-
// 解析依赖
101-
value, err := c.resolver.Resolve(typ, mergedOpts)
102-
if err != nil {
103-
return nil, err
104-
}
105-
106-
if !value.IsValid() {
107-
return nil, NewNotFoundError(typ)
108-
}
109-
110-
return value.Interface(), nil
111-
}
112-
11392
// Graph 获取依赖关系图
11493
func (c *ContainerImpl) Graph() *Graph {
11594
renderer := NewDotRenderer()
File renamed without changes.

example/cycle/main.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@ package main
22

33
import (
44
"fmt"
5+
"strings"
56

67
"github.com/pubgo/dix/dixglobal"
78
"github.com/pubgo/funk/recovery"
89
)
910

1011
func main() {
11-
defer recovery.Exit()
12+
defer recovery.Exit(func(err error) error {
13+
if strings.Contains(err.Error(), "circular dependency detected") {
14+
return nil
15+
}
16+
return err
17+
})
18+
1219
defer func() {
1320
fmt.Println("\n=== Final Dependency Graph ===")
1421
graph := dixglobal.Graph()
@@ -36,13 +43,8 @@ func main() {
3643
})
3744

3845
fmt.Println("Registering C provider (depends on A)")
46+
3947
dixglobal.Provide(func(a *A) *C {
4048
return &C{Name: "C depends on " + a.Name}
4149
})
42-
43-
fmt.Println("\n=== Attempting to Inject (should detect cycle) ===")
44-
// 尝试注入,这应该会检测到循环依赖并panic
45-
dixglobal.Inject(func(c *C) {
46-
fmt.Println("Successfully injected C:", c.Name)
47-
})
4850
}

example/provider-error-correct/main.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func main() {
139139
// 示例1:正常获取实例
140140
fmt.Println("=== 正常实例获取 ===")
141141
var userService *UserService
142-
err := dix.Inject(container, func(us *UserService) {
142+
_, err := dix.Inject(container, func(us *UserService) {
143143
userService = us
144144
})
145145
if err != nil {
@@ -171,7 +171,7 @@ func main() {
171171

172172
// 演示配置错误
173173
fmt.Println("尝试注入 Config (期望错误):")
174-
err = dix.Inject(errorContainer, func(c *Config) {
174+
_, err = dix.Inject(errorContainer, func(c *Config) {
175175
// 这个函数不会被调用,因为提供者会失败
176176
})
177177
if err != nil {
@@ -180,7 +180,7 @@ func main() {
180180

181181
// 演示数据库错误
182182
fmt.Println("尝试注入 Logger (期望错误):")
183-
err = dix.Inject(errorContainer, func(l Logger) {
183+
_, err = dix.Inject(errorContainer, func(l Logger) {
184184
// 这个函数不会被调用,因为提供者会失败
185185
})
186186
if err != nil {
@@ -207,7 +207,7 @@ func main() {
207207
// 成功的提供者
208208
fmt.Println("获取成功的Logger:")
209209
var logger Logger
210-
err = dix.Inject(mixedContainer, func(l Logger) {
210+
_, err = dix.Inject(mixedContainer, func(l Logger) {
211211
logger = l
212212
})
213213
if err != nil {
@@ -218,7 +218,7 @@ func main() {
218218

219219
// 失败的提供者
220220
fmt.Println("尝试获取失败的Config:")
221-
err = dix.Inject(mixedContainer, func(c *Config) {
221+
_, err = dix.Inject(mixedContainer, func(c *Config) {
222222
// 不会执行到这里
223223
})
224224
if err != nil {

example/provider-error/main.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func main() {
100100
// 示例1:正常获取实例
101101
fmt.Println("=== 正常实例获取 ===")
102102
var userService *UserService
103-
err := dix.Inject(container, func(us *UserService) {
103+
_, err := dix.Inject(container, func(us *UserService) {
104104
userService = us
105105
})
106106
if err != nil {
@@ -140,7 +140,7 @@ func main() {
140140

141141
// 演示配置错误
142142
fmt.Println("尝试注入 Config (期望错误):")
143-
err = dix.Inject(errorContainer, func(c *Config) {
143+
_, err = dix.Inject(errorContainer, func(c *Config) {
144144
// 这个函数不会被调用,因为提供者会失败
145145
})
146146
if err != nil {
@@ -149,7 +149,7 @@ func main() {
149149

150150
// 演示数据库错误
151151
fmt.Println("尝试注入 Database (期望错误):")
152-
err = dix.Inject(errorContainer, func(d Database) {
152+
_, err = dix.Inject(errorContainer, func(d Database) {
153153
// 这个函数不会被调用,因为提供者会失败
154154
})
155155
if err != nil {
@@ -177,7 +177,7 @@ func main() {
177177
// 成功的提供者
178178
fmt.Println("获取成功的字符串:")
179179
var str *string
180-
err = dix.Inject(mixedContainer, func(s *string) {
180+
_, err = dix.Inject(mixedContainer, func(s *string) {
181181
str = s
182182
})
183183
if err != nil {
@@ -188,7 +188,7 @@ func main() {
188188

189189
// 失败的提供者
190190
fmt.Println("尝试获取失败的int:")
191-
err = dix.Inject(mixedContainer, func(i *int) {
191+
_, err = dix.Inject(mixedContainer, func(i *int) {
192192
// 不会执行到这里
193193
})
194194
if err != nil {

go.work.sum

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,7 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
875875
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
876876
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
877877
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
878+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
878879
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
879880
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
880881
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=

0 commit comments

Comments
 (0)