2011-10-13 32 views
31

¿Cómo inyecto dependencias en el archivo global.asax.cs, es decir, la clase MvcApplication?Cómo inyectar dependencias en global.asax.cs

Al haber usado previamente el patrón Localizador de servicios (anti-) para la inyección de dependencias, trato de seguir los consejos de mejores prácticas en mi última aplicación MVC usando un contenedor IOC (específicamente Unity.Mvc3 porque viene con una implementación del IDependencyResolver fuera de la caja) y la inyección del constructor.

Todo parece bastante sencillo hasta ahora excepto por un par de inconvenientes, uno de los cuales se encuentra en global.asax.cs (el otro es para atributos personalizados, pero hay una pregunta sobre SO que cubre eso).

Los controladores de eventos HttpApplication en la clase MvcApplication como:

Application_Start() 
Application_EndRequest(object sender, EventArgs e) 
Application_AcquireRequestState(object sender, EventArgs e) 

pueden requerir dependencias externas, por ejemplo una dependencia de un ILogService. Entonces, ¿cómo los inyectaré sin recurrir al patrón de localización de servicios (anti-) de, p.

private static ILogService LogService 
{ 
    get 
    { 
     return DependencyResolver.Current.GetService<ILogService>(); 
    } 
} 

Cualquier ayuda/consejo ¡muy apreciado!

+0

Hola, pregunta interesante! ¿Por qué no puede inyectar dependencias dentro de su global.asax en OnApplicationStarted? Si la aplicación no puede iniciarse, lo sabrá, ya que nada funcionará ... –

Respuesta

31

La clase en su global.asax.cs es su Composition Root, por lo que no puede (y no debe) inyectar nada desde fuera.

Sin embargo, sólo hay una instancia de la clase MvcApplication, así que si usted necesita un servicio en uno de sus métodos, puede declarar como un campo miembro de - por ejemplo:

public class MvcApplication : System.Web.HttpApplication 
{ 
    private readonly ILogService log; 

    public MvcApplication() 
    { 
     this.log = new MyLogService(); 
    } 

    protected void Application_Start() 
    { 
     // ... 

     this.log.Log("Application started"); 
    } 
} 
+5

+1 en el blog Composition Root. ¡Buena cosa! –

+1

Gracias por la rápida respuesta Mark. Sin embargo, ¿cómo prueba los métodos unitarios si no puede inyectar una instancia simulada de, p. el ILogService? – magritte

+4

Yo no. Una raíz de composición es un ejemplo de un objeto humilde (http://xunitpatterns.com/Humble%20Object.html). Si necesita invocar lógica compleja desde allí, puede delegar en otra clase que * puede * ser probada en una unidad. –

Cuestiones relacionadas