How to Avoid DI Frameworks and Use Plain Go

Avoid Go DI frameworks by using constructor functions and interfaces to manually inject dependencies into your structs and functions.

You avoid DI frameworks in Go by using constructor functions, interfaces, and dependency injection via function parameters or struct fields. This approach keeps your code simple, testable, and free of external dependencies.

// Define an interface for your dependency
type Logger interface {
    Log(msg string)
}

// Define a concrete implementation
type StdLogger struct{}

func (s *StdLogger) Log(msg string) {
    fmt.Println(msg)
}

// Define your service with dependency injection
type Service struct {
    logger Logger
}

// Constructor function to inject dependencies
func NewService(logger Logger) *Service {
    return &Service{logger: logger}
}

// Usage
func main() {
    logger := &StdLogger{}
    service := NewService(logger)
    service.logger.Log("Hello, World!")
}