Providers & DI Scopes
How gonest builds and scopes dependency instances
A Provider builds one instance for the DI graph. Build one with
gonest.NewProvider(func(provider *gonest.Provider) {...}).
var UserProvider = gonest.NewProvider(func(provider *gonest.Provider) {
provider.Scope(gonest.ScopeSingleton)
provider.Constructor(func() *UserService { return &UserService{} })
})Constructor signatures
Constructor accepts exactly one of these four function shapes — never a
function with dependency parameters:
func() Tfunc() (T, error)func(ctx) Tfunc(ctx) (T, error)
Dependencies are resolved with MustInject/MustInjectAll inside the
builder, before Constructor is called — not as parameters to the
constructor function itself.
Scopes
| Scope | Behavior |
|---|---|
gonest.ScopeSingleton | One instance for the whole app (default). |
gonest.ScopeTransient | A new instance on every resolve. |
gonest.ScopeRequest | One instance per HTTP request. |
Resolving dependencies
MustInject[T](owner) resolves by type and panics unless exactly one match is
found. Pointer types (*UserService) require an exact match; interface types
match exactly or fall back to reflect.Type.Implements().
MustInjectAll[T](owner) returns every match for T — used for
plugin/strategy patterns — and never panics on 0 or N matches.
type Connectable interface{ Ping() bool }
var SystemController = gonest.NewController(func(controller *gonest.Controller) {
connectables := gonest.MustInjectAll[Connectable](controller)
_ = connectables
})