Skip to content
/ di Public

DI es una librería **minimalista y de alto rendimiento** que facilita la inyección y resolución de dependencias en proyectos Go sin imponer frameworks pesados ni generar código.

Notifications You must be signed in to change notification settings

jad21/di

Repository files navigation

DI – Inyector de Dependencias ligero para Go

DI es una librería minimalista y de alto rendimiento que facilita la inyección y resolución de dependencias en proyectos Go sin imponer frameworks pesados ni generar código.
Su objetivo principal es velocidad en lectura (Get, Resolve) y ejecución (Invoke), manteniendo la API simple y 100 % orientada a valores nativos de reflect.


Características

Función Descripción ns/op *
Map Registra un valor concreto o asocia una interfaz con su implementación. ~530
Provide Registra un provider (función) que se evalúa «lazy» o «eager». -
Get Recupera un valor por tipo en ~12 ns sin asignaciones. 12 ns
Resolve Inyecta dependencias sobre variables existentes (pointer). 15 ns
Invoke Ejecuta una función resolviendo sus argumentos (con caché interno). 440 ns
ResolveT[T] Versión genérica de Resolve para Go 1.21+.

* Benchmarks medidos en un Intel i7-6600U @ 2.60 GHz, Go 1.21, Linux amd64 (new-3.4.txt).
Consulta la carpeta benchmarks/ para reproducirlos.


Instalación

go github.com/jad21/di

Ejemplo rápido

package main

import (
	"fmt"
	"github.com/jad21/di"
)

type Config struct{ Msg string }

func main() {
	inj := di.New()

	// Registrar un valor
	inj.Map(&Config{Msg: "Hola DI"})

	// Resolver con genéricos
	cfg, _ := di.GetT[*Config](inj)
	fmt.Println(cfg.Msg) // > Hola DI

	// Invocar una función
	inj.Invoke(func(c *Config) {
		fmt.Println("Invoke:", c.Msg)
	})

	// Resolve sobre variable existente
	var c2 *Config
	_ = inj.Resolve(&c2)
	fmt.Println("Resolve:", c2.Msg)
}

Benchmarks

# todos los benchmarks, incluido el nuevo de Resolve
go test -bench=. ./...

Salida esperada (resumen):

BenchmarkInjectorMap-4       ~530 ns/op
BenchmarkInjectorGet-4       ~12 ns/op
BenchmarkInjectorResolve-4   ~15 ns/op
BenchmarkInjectorInvoke-4    ~440 ns/op

API genérica (Go 1.21+)

// Obtener un valor por tipo con cero reflejo extra
val, ok := di.GetT[*MyType](inj)

// Resolver e inyectar sobre variable local
cfg, err := di.ResolveT[*Config](inj)

Contribuir

  1. Bifurca el repositorio y crea tu rama (git checkout -b nueva-funcionalidad)
  2. Asegúrate de que go test ./... pasa sin errores ni race.
  3. Envía tu pull request con una descripción clara.

Hoja de ruta

  • Añadir soporte opcional para Wire-style code-gen
  • Mejora de ergonomía con métodos genéricos (Go 1.22+)
  • Integración con contextos (InvokeCtx)

Licencia

MIT © JAD21, Jose A Delgado.

About

DI es una librería **minimalista y de alto rendimiento** que facilita la inyección y resolución de dependencias en proyectos Go sin imponer frameworks pesados ni generar código.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages