di/di_test.go

77 lines
1.3 KiB
Go

package di_test
import (
"fmt"
"go.neonxp.ru/di"
)
func ExampleGet() {
di.Register("serviceA", func() (*ServiceA, error) { // <- Register service A
return &ServiceA{}, nil
})
di.Register("serviceB", func() (*ServiceB, error) { // <- Register service B, that depends from service A
serviceA, err := di.GetByType[ServiceA]() // <- Get dependency from container by type
if err != nil {
return nil, err
}
return &ServiceB{
ServiceA: serviceA[0],
}, nil
})
// Do work...
service, err := di.Get[ServiceB]("serviceB") // <- Get instantinated service B
if err != nil {
panic(err)
}
service.DoStuff() // Output: Hello, world!
}
func ExampleGet_interface() {
di.Register("worker1", func() (*Worker1, error) {
return &Worker1{}, nil
})
di.Register("worker2", func() (*Worker2, error) {
return &Worker2{}, nil
})
workers, err := di.GetByInterface[Worker]()
if err != nil {
panic(err)
}
for _, w := range workers {
w.Do()
}
}
type ServiceA struct{}
func (d *ServiceA) DoStuff() {
fmt.Println("Hello, world!")
}
type ServiceB struct {
ServiceA *ServiceA
}
func (d *ServiceB) DoStuff() {
d.ServiceA.DoStuff()
}
type Worker interface {
Do()
}
type Worker1 struct{}
func (w *Worker1) Do() {
fmt.Println("Worker 1 says hello")
}
type Worker2 struct{}
func (w *Worker2) Do() {
fmt.Println("Worker 2 says hello")
}