-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample_test.go
More file actions
104 lines (72 loc) · 2.48 KB
/
example_test.go
File metadata and controls
104 lines (72 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package dofactory_test
import (
"fmt"
"github.com/samber/do/v2"
"github.com/d-enk/dofactory"
)
type Service struct {
Name string
}
func NewService(name string) *Service {
return &Service{Name: name}
}
func ExampleNewService() {
injector := do.New()
// Provide service name
do.ProvideValue(injector, "MyService")
// Convert factory to provider
factoryProvider := dofactory.ToProvider[*Service](NewService)
// Register provider
do.Provide(injector, factoryProvider)
// Retrieve the instance from the container
service := do.MustInvoke[*Service](injector)
fmt.Println(service.Name) // Output: MyService
}
func NewServiceWithError(name string, withError bool) (*Service, error) {
if withError {
return nil, fmt.Errorf("ERROR")
}
return &Service{Name: name}, nil
}
func ExampleNewServiceWithError() {
injector := do.New()
do.ProvideValue(injector, "MyService")
factoryProvider := dofactory.ToProvider[*Service](NewServiceWithError)
do.ProvideTransient(injector, factoryProvider)
// Register flag - NO error
do.ProvideValue(injector, false)
fmt.Println(do.Invoke[*Service](injector))
// Set flag - error
do.OverrideValue(injector, true)
fmt.Println(do.Invoke[*Service](injector))
// output:
// &{MyService} <nil>
// <nil> ERROR
}
type (
ConvertibleService Service
ConvertibleName string
)
func NewConvertibleService(name ConvertibleName) *ConvertibleService {
return &ConvertibleService{Name: string(name)}
}
func (*ConvertibleService) String() string { return "interface{ String() string }" }
func ExampleNewConvertibleService() {
injector := do.New()
// Provide service name
do.ProvideValue(injector, "MyService")
do.ProvideValue(injector, ConvertibleName("MyConvertibleService"))
// Register Service factory provider with conversion to ConvertibleService
do.Provide(injector, dofactory.ToProvider[*ConvertibleService](NewService))
// Register ConvertibleService factory provider with conversion to Service
do.Provide(injector, dofactory.ToProvider[*Service](NewConvertibleService))
// Register ConvertibleService factory provider with conversion to interface
do.Provide(injector, dofactory.ToProvider[interface{ String() string }](NewConvertibleService))
fmt.Println(do.MustInvoke[*ConvertibleService](injector).Name) // MyService
fmt.Println(do.MustInvoke[*Service](injector).Name) // MyConvertibleService
fmt.Println(do.MustInvoke[interface{ String() string }](injector))
// Output:
// MyService
// MyConvertibleService
// interface{ String() string }
}