A dependency injector.
Divine injects dependencies into a function by inspecting its signature and provides the arguments based on their type. If the dependency cannot be found, an error is returned and the function isn't executed.
Features:
- Statically & Lazily provided dependencies
- Circular dependency detection
- Chaining dependency lookups across containers
Provide a dependency by its concrete type
package main
import (
"fmt"
"github.com/shamus/divine"
)
type (
Configuration struct {
Foo string
}
)
func main() {
container := divine.New()
container.Provide(Configuration{Foo: "value"})
divine.Inject(container, func(configuration Configuration) {
fmt.Println(configuration.Foo)
})
}
Provide a dependency as another type
package main
import (
"fmt"
"github.com/shamus/divine"
)
type (
Configuration interface {
Foo() string
}
simpleConfiguration struct{}
)
func (c simpleConfiguration) Foo() string {
return "value"
}
func main() {
container := divine.New()
container.Provide(simpleConfiguration{}, divine.AsType((*Configuration)(nil)))
divine.Inject(container, func(configuration Configuration) {
fmt.Println(configuration.Foo())
})
}
Provide a dependency lazily
package main
import (
"fmt"
"github.com/shamus/divine"
)
type (
Configuration struct {
Foo string
}
)
func main() {
container := divine.New()
container.ProvideLazily(func() {
return Configuration{Foo: "value"}
})
divine.Inject(container, func(configuration Configuration) {
fmt.Println(configuration.Foo)
})
}