-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinjector_defer.go
51 lines (44 loc) · 1.63 KB
/
injector_defer.go
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
package injector
import (
"reflect"
"github.com/infinytum/structures"
)
var (
deferredFactories structures.Table[string, string, *deferredFactory] = structures.NewTable[string, string, *deferredFactory]()
)
type deferredFactory struct {
IsSingleton bool
Resolver interface{}
}
// DeferredSingleton will register a dependency that is only instantiated once, then re-used
// for all future resolve calls. The resolver function will be introspected at the first time its needed.
func DeferredSingleton(resolver interface{}, name ...string) error {
depFactoryType := reflect.TypeOf(resolver)
return deferredFactories.Set(reflectTypeKey(depFactoryType.Out(0)), nameOrDefault(name), &deferredFactory{
IsSingleton: true,
Resolver: resolver,
})
}
// DeferredTransient will register a dependency that is instantiated every time it's resolved.
// The resolver function will be introspected at the first time its needed.
func DeferredTransient(resolver interface{}, name ...string) error {
depFactoryType := reflect.TypeOf(resolver)
return deferredFactories.Set(reflectTypeKey(depFactoryType.Out(0)), nameOrDefault(name), &deferredFactory{
IsSingleton: false,
Resolver: resolver,
})
}
func activateDeferredFactories(t reflect.Type, name ...string) error {
deferredFactory, ok := deferredFactories.Get(reflectTypeKey(t), nameOrDefault(name))
if ok == structures.TableKeysNotFound {
return nil
}
if ok != nil {
return ok
}
defer deferredFactories.Delete(reflectTypeKey(t), nameOrDefault(name))
if deferredFactory.IsSingleton {
return Singleton(deferredFactory.Resolver, name...)
}
return Transient(deferredFactory.Resolver, name...)
}