-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontainer.go
More file actions
143 lines (107 loc) · 2.39 KB
/
container.go
File metadata and controls
143 lines (107 loc) · 2.39 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package container
import (
"reflect"
)
type Container struct {
instances map[any]any
registers map[any]any
factories []Factory
}
var DefaultContainer = NewContainer()
func NewContainer() *Container {
return &Container{
instances: make(map[any]any),
registers: make(map[any]any),
}
}
func (c *Container) AddFactory(factory Factory) {
c.factories = append(c.factories, factory)
}
func (c *Container) Register(key any, value any) {
c.registers[key] = value
}
func (c *Container) Make(key any) any {
if a, ok := c.instances[key]; ok {
return a
}
if a, ok := c.registers[key]; ok {
of := reflect.ValueOf(a)
if of.Kind() == reflect.Func {
return of.Call(nil)[0].Interface()
}
} else {
for _, factory := range c.factories {
if factory.Resolvable(key) {
v := factory.Resolve(key)
if factory.IsShared(key) {
c.instances[key] = v
}
return v
}
}
return DefaultFactoryInstance.Resolve(key)
}
return nil
}
func (c *Container) Set(key any, ins any) {
c.instances[key] = ins
}
func (c *Container) Get(key any) any {
return c.instances[key]
}
func (c *Container) Has(key any) bool {
_, ok := c.instances[key]
return ok
}
func (c *Container) RegisteredKeys() []string {
var keys []string
for k, _ := range c.registers {
keys = append(keys, reflect.TypeOf(k).String())
}
return keys
}
func (c *Container) Clear() {
c.instances = make(map[any]any)
c.registers = make(map[any]any)
}
func Set[T any](ins T) {
var t *T
DefaultContainer.Set(reflect.TypeOf(t).Elem(), ins)
}
func Get[T any]() T {
var t *T
return DefaultContainer.Get(reflect.TypeOf(t).Elem()).(T)
}
func Has[T any]() bool {
var t *T
return DefaultContainer.Has(reflect.TypeOf(t).Elem())
}
func Make[T any]() T {
var t *T
return DefaultContainer.Make(reflect.TypeOf(t).Elem()).(T)
}
func Register[T any](callback any) {
var t *T
DefaultContainer.Register(reflect.TypeOf(t).Elem(), callback)
}
func RegisteredKeys() []string {
return DefaultContainer.RegisteredKeys()
}
func RegisterK(key string, callback any) {
DefaultContainer.Register(key, callback)
}
func SetK(key string, ins any) {
DefaultContainer.Set(key, ins)
}
func MakeK[T any](key string) T {
return DefaultContainer.Make(key).(T)
}
func GetK[T any](key string) T {
return DefaultContainer.Get(key).(T)
}
func Clear() {
DefaultContainer.Clear()
}
func AddFactory(factory Factory) {
DefaultContainer.AddFactory(factory)
}