gonest
Core Concepts

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() T
  • func() (T, error)
  • func(ctx) T
  • func(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

ScopeBehavior
gonest.ScopeSingletonOne instance for the whole app (default).
gonest.ScopeTransientA new instance on every resolve.
gonest.ScopeRequestOne 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
})

Next steps

On this page