¿Qué es Wire y para qué sirve?
\n\nWire es una biblioteca de inyección de dependencias (Dependency Injection, DI) para el lenguaje Go, desarrollada por el equipo de Google. A diferencia de muchos otros frameworks de DI que funcionan en tiempo de ejecución (runtime), Wire utiliza generación de código en la etapa de compilación. Esta es una diferencia clave: Wire analiza tu código y genera el archivo wire_gen.go que contiene toda la lógica de enlace de dependencias. Este enfoque elimina los errores relacionados con la reflexión (reflect) y hace que el código sea completamente tipado.
¿Para qué sirve?
\n- \n
- Simplificación de la configuración: En lugar de crear manualmente todas las dependencias en main.go, Wire lo hace automáticamente. \n
- Pruebas: Puedes reemplazar fácilmente las implementaciones reales por mocks (simulaciones) para pruebas unitarias. \n
- Código limpio: El código se vuelve más modular y con menor acoplamiento (low coupling). \n
- Seguridad de tipos: Los errores de configuración se detectan en la etapa de compilación, no en tiempo de ejecución. \n
Wire es ideal para proyectos grandes donde la cantidad de dependencias se cuenta por decenas y centenas.
\n\nInstalación
\n\nWire no es una biblioteca en el sentido tradicional (como un paquete que se importa). Es una herramienta de línea de comandos (CLI). La instalación se realiza a través del gestor de paquetes estándar de Go:
\n\ngo install github.com/google/wire/cmd/wire@latest\n\nDespués de ejecutar este comando, el archivo binario wire estará disponible en tu $GOPATH/bin (o $GOBIN). Asegúrate de que este directorio esté agregado a la variable de entorno PATH.
Verifica la instalación:
\n\nwire help\n\nSi ves la ayuda de comandos, ¡todo está listo para trabajar!
\n\nInicio rápido con ejemplo de código
\n\nVamos a crear una aplicación simple que saluda al usuario. Tendremos tres componentes: Message, Greeter (saludador) y Event (evento).
Paso 1: Estructura del proyecto
\n\nmyapp/\n├── main.go\n├── wire.go\n└── wire_gen.go (será generado)\n\nPaso 2: Creamos los componentes (main.go)
\n\npackage main\n\nimport "fmt"\n\n// Message — estructura simple que contiene texto.\ntype Message struct {\n Text string\n}\n\n// NewMessage — constructor para Message.\nfunc NewMessage(text string) Message {\n return Message{Text: text}\n}\n\n// Greeter — estructura que saluda usando Message.\ntype Greeter struct {\n Message Message\n}\n\n// NewGreeter — constructor para Greeter.\nfunc NewGreeter(m Message) Greeter {\n return Greeter{Message: m}\n}\n\n// Greet — método que devuelve el saludo.\nfunc (g Greeter) Greet() Message {\n return g.Message\n}\n\n// Event — estructura que representa un evento.\ntype Event struct {\n Greeter Greeter\n}\n\n// NewEvent — constructor para Event.\nfunc NewEvent(g Greeter) Event {\n return Event{Greeter: g}\n}\n\n// Start — método que inicia el evento.\nfunc (e Event) Start() {\n msg := e.Greeter.Greet()\n fmt.Println(msg.Text)\n}\n\nfunc main() {\n // Creación manual de dependencias (sin Wire)\n message := NewMessage("¡Hola, Wire!")\n greeter := NewGreeter(message)\n event := NewEvent(greeter)\n\n event.Start()\n}\n\nPaso 3: Creamos el archivo wire.go
\n\nEste archivo es el "proveedor" para Wire. Contiene funciones inicializadoras (providers) y una función que le dice a Wire qué debe ensamblar.
\n\n//go:build wireinject\n// +build wireinject\n\npackage main\n\nimport "github.com/google/wire"\n\n// InitializeEvent — función que Wire usará para generar código.\n// Declara que necesitamos un Event, y Wire construirá el grafo de dependencias.\nfunc InitializeEvent(text string) Event {\n w