Estoy en el proceso de introducir un marco de inyección de dependencias en una aplicación WebForms existente (usando Castle Windsor).Webforms and Dependency Injection
Tengo una experiencia bastante profunda con DI, y tiendo a favorecer fuertemente la inyección del constructor sobre la inyección del colocador. Si está familiarizado con Webforms, sabrá que el marco ASP.Net maneja la construcción de objetos de página y control, lo que imposibilita la verdadera inyección de constructor.
Mi solución actual es registrar el contenedor en el evento Application_Start de Global.asax, y mantener el contenedor como una variable estática pública en Global también. Luego simplemente resuelvo cada servicio que necesito directamente en la página o control cuando los necesito. Así que en la parte superior de cada página, termino con un código como éste:
private readonly IMyService _exposureManager = Global.IoC.Resolve<IMyService>();
private readonly IMyOtherService _tenCustomersExposureManager = Global.IoC.Resolve<IMyOtherService>();
Obviamente, no me gusta tener todas estas referencias al contenedor esparcidos sobre mi solicitud o tener mi página Dependencias/control no sean -explícito, pero no he podido encontrar una mejor manera.
¿Existe una solución más elegante para usar DI con Webforms?
Encontré este artículo http://www.codemag.com/Article/1210031 que tiene un código de muestra excelente sobre cómo implementar la inyección de dependencia en WPF, MVC y WebForms (usando 'PageHandlerFactory', en el caso de WebForms) . Parece decir que debido a las limitaciones de clase de código subyacente, tendrá que usar la inyección setter. También, curiosamente, muestra cómo Microsoft Managed Extensibility Framework (MEF) puede ayudarlo a resolver este y otros problemas DI similares de una manera muy útil y poco estándar. –