A simple dependency injection container for Go.
Zero dependencies, no reflection, no code generation.
go get github.com/eerzho/simpledipackage main
import "github.com/eerzho/simpledi"
type Database struct {
URL string
}
func (d *Database) Close() error {
return errors.New("database close error")
}
type Service struct {
Database *Database
}
func main() {
// Close all definitions in reverse order at the end
defer simpledi.Close()
// Define database
simpledi.Set(simpledi.Definition{
ID: "database",
New: func() any {
return &Database{URL: "postgres"}
},
Close: func() error {
database := simpledi.Get[*Database]("database")
return database.Close()
},
})
// Define service
simpledi.Set(simpledi.Definition{
ID: "service",
Deps: []string{"database"},
New: func() any {
database := simpledi.Get[*Database]("database")
return &Service{Database: database}
},
})
// Resolve all dependencies in correct order
simpledi.Resolve()
// Use the service
service := simpledi.Get[*Service]("service")
_ = service
}- Zero dependencies
- No reflection
- Type-safe with generics
- Automatic dependency ordering
Full documentation and examples: pkg.go.dev.
simpledi provides the core features intended.
Further improvements or new features may be introduced as good ideas come up.
Suggestions and feedback are always welcome.