-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
example_test.go
67 lines (52 loc) · 1.45 KB
/
example_test.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package di_test
import (
"fmt"
"github.com/Prastiwar/Go-flow/di"
)
type Dependency interface{}
type someDependency struct{} // implements Dependency
func NewSomeDependency() *someDependency {
return &someDependency{}
}
type SomeInterface interface{}
type someService struct { // implements SomeInterface
serv Dependency
}
func NewSomeService(serv Dependency) *someService {
return &someService{
serv: serv,
}
}
func Example() {
// register constructors for services and dependencies. By default all services are transient
container, err := di.Register(
NewSomeService,
NewSomeDependency,
)
// alternatively you can setup lifetime
// container, err := di.Register(
// di.Construct(di.Singleton, NewSomeService),
// di.Construct(di.Transient, NewSomeDependency),
// di.Construct(di.Scoped, NewSomeDependency),
// )
if err != nil {
// each ctor must be func Kind with single output parameter
panic(err)
}
// di.Register() already calls this validation - you don't need to do it again
err = container.Validate()
if err != nil {
// any service couldn't be created due to missing or cyclic dependencies
panic(err)
}
// use container.Scope() to create new scoped container which caches scoped services
// scopedContainer := container.Scope()
var s SomeInterface
fmt.Println(s == nil)
// panics when there is not service implementing SomeInterface
container.Provide(&s)
fmt.Println(s == nil)
// Output:
// true
// false
}