A dependency injection container for Go 1.18.
package main
import (
"os"
"github.com/frixuu/dino"
"go.uber.org/zap"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type AccountIdCache interface{}
type AccountIdCacheImpl struct{}
type AccountController struct {
Cache AccountIdCache
DB *gorm.DB `dino:"named:accounts"`
Logger *zap.Logger
}
func (c *AccountController) DoWork() {
c.Logger.Info("Hello, world!")
}
func main() {
// Create the container
c := &dino.Container{}
// Register a singleton.
// It will be created once and persist for the whole lifetime of the container
dino.Add[AccountIdCache, AccountIdCacheImpl](c)
// Register a transient.
// It will be recreated each time it gets requested from the container
dino.AddTransient[*AccountController, AccountController](c)
// If you have some existing objects, you can register them as instances
logger, _ := zap.NewProduction()
defer logger.Sync()
dino.AddInstance[*zap.Logger](c, logger)
// If you want to use the same types in different contexts, use named bindings
db, _ := gorm.Open(postgres.Open(os.Getenv("DSN_ACCOUNTS")), &gorm.Config{})
dino.AddInstanceNamed[*gorm.DB](c, "accounts", db)
// Request a service from the container
controller, _ := dino.Get[*AccountController](c)
controller.DoWork()
}
This project is influenced by zekroTJA's prior work, MIT-licensed.