WinForms.Extensions.DependencyInjection : Introducción
WinForms sigue siendo ampliamente utilizado en aplicaciones industriales críticas, pero su arquitectura heredada dificulta la adopción de buenas prácticas modernas como la inyección de dependencias (DI). El framework WinForms.Extensions.DependencyInjection resuelve este problema proporcionando una integración avanzada de DI, diseñada específicamente para WinForms, basada en la robusta infraestructura de Microsoft.Extensions.DependencyInjection.
¿Por qué este framework?
Las soluciones DI tradicionales, aunque excelentes para ASP.NET Core o WPF, no se adaptan naturalmente al ciclo de vida y particularidades de las aplicaciones WinForms. Este framework:
- Simplifica la configuración del contenedor DI adaptado a WinForms.
- Gestiona adecuadamente el ciclo de vida de los formularios mediante scopes.
- Permite la inyección por constructor y también por propiedades marcadas con
[Inject]. - Proporciona el gancho
IInjectable.OnInjectedpara ejecutar lógica de inicialización tras la inyección. - Expone acceso global al
ServiceProviderpara escenarios avanzados. - Se integra de forma natural con otros frameworks del ecosistema: Reactive y RouteManager.
En resumen, facilita arquitecturas limpias, desacopladas, testables y sostenibles, adaptadas a los retos reales de los proyectos WinForms modernos.
Características clave
- Configuración simplificada: Método
BuildWinFormsServiceProviderpara adaptar el contenedor al entorno WinForms. - Formularios con scope:
FormFactory.CreateScopedForm<T>()permite crear formularios con ciclo de vida independiente. - Inyección por propiedades: Usa el atributo
[Inject]para resolver dependencias automáticamente. - Interfaz
IInjectable: Ejecuta lógica personalizada tras la resolución de dependencias. - Acceso global:
ServiceProviderGlobal.Instancepermite acceder al DI container desde cualquier punto. - Integración fluida con Reactive y RouteManager: pensada para trabajar en conjunto.
Instalación
dotnet add package WinForms.Extensions.DependencyInjection
O bien, clona el proyecto y compila desde el repositorio: GitHub
Inicio rápido
En Program.cs:
using Microsoft.Extensions.DependencyInjection;
using WinForms.Extensions.DependencyInjection.Bootstrap;
var services = new ServiceCollection();
// Registrar servicios y formularios
services.AddSingleton<IMainService, MainService>();
services.AddTransient<MainForm>();
services.AddSingleton<FormFactory>();
var provider = services.BuildWinFormsServiceProvider();
ServiceProviderGlobal.Instance.Initialize(provider);
Application.Run(provider.GetRequiredService<MainForm>());
Crear formularios scoped
var formFactory = provider.GetRequiredService<FormFactory>();
var settingsForm = formFactory.CreateScopedForm<SettingsForm>();
settingsForm.Show();
Inyección de propiedades con [Inject]
public partial class MainForm : Form, IInjectable
{
[Inject]
public IMyService MyService { get; set; }
public MainForm()
{
InitializeComponent();
this.ResolveInjectedProperties(ServiceProviderGlobal.Instance.Provider);
}
public void OnInjected()
{
// Lógica de inicialización post-inyección
}
}
API Pública Principal
ServiceProviderBuilder.BuildWinFormsServiceProvider(IServiceCollection): construye el contenedor DI adaptado a WinForms.FormFactory.CreateScopedForm<T>(): crea formularios con ciclo de vida propio.[Inject]: marca propiedades para inyección automática.ResolveInjectedProperties(this object, IServiceProvider): extensión para realizar la inyección de propiedades.IInjectable: interfaz para ejecutar código luego de la inyección.ServiceProviderGlobal.Instance: singleton de acceso global al contenedor.
Beneficios
Este framework resuelve los problemas comunes de DI en WinForms respetando su arquitectura nativa, permitiendo modernizar aplicaciones existentes con un enfoque más limpio y mantenible.
Repositorio y contribuciones
https://github.com/JoeDevSharp/WinForms.Extensions.DependencyInjection
Contribuciones, issues y pull requests son bienvenidos.


