Providers & Dependency Injection

Providers are the core of GoNest’s DI system. Any constructor function registered in a module’s Providers array can be automatically resolved and injected.

Constructor Injection

The DI container inspects constructor function parameters via reflection:

// CatsService has no dependencies
func NewCatsService() *CatsService {
    return &CatsService{}
}

// CatsController depends on CatsService — injected automatically
func NewCatsController(service *CatsService) *CatsController {
    return &CatsController{service: service}
}

Register both in the module:

var CatsModule = gonest.NewModule(gonest.ModuleOptions{
    Controllers: []any{NewCatsController},
    Providers:   []any{NewCatsService},
})

Provider Types

Constructor Provider (default)

gonest.Provide(NewCatsService)

Value Provider

gonest.ProvideValue[*Config](myConfig)

Factory Provider

gonest.ProvideFactory[*sql.DB](func(config *Config) (*sql.DB, error) {
    return sql.Open("postgres", config.DatabaseURL)
})

Interface Binding

gonest.Bind[Repository](NewPostgresRepository)
// Now injecting Repository interface resolves to *PostgresRepository

Token Provider

gonest.ProvideTokenValue("JWT_SECRET", "my-secret-key")
// Resolve via: container.ResolveByToken("JWT_SECRET")

Scopes

// Singleton (default) — one instance for the entire app
gonest.Provide(NewCatsService)

// Transient — new instance every time it's injected
gonest.ProvideWithScope(NewCatsService, gonest.ScopeTransient)

// Request — new instance per HTTP request
gonest.ProvideWithScope(NewRequestLogger, gonest.ScopeRequest)

Resolving from Container

// Generic resolve
svc, err := gonest.Resolve[*CatsService](container)

// Must resolve (panics on error)
svc := gonest.MustResolve[*CatsService](container)

// From application
app.GetContainer()

Lifecycle Hooks

Providers can implement lifecycle interfaces:

func (s *DatabaseService) OnModuleInit() error {
    return s.connect()
}

func (s *DatabaseService) OnModuleDestroy() error {
    return s.disconnect()
}

func (s *CacheService) OnApplicationBootstrap() error {
    return s.warmup()
}

func (s *CleanupService) OnApplicationShutdown(signal string) error {
    return s.cleanup()
}