Pregunta Cómo inyectar dependencias en global.asax.cs


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

Habiendo utilizado 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 utilizando un contenedor IOC (específicamente Unity.Mvc3 porque viene con una implementación del IDependencyResolver fuera del caja) e inyección de constructor.

Todo parece bastante directo hasta el momento, excepto por un par de inconvenientes, uno de los cuales está 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, por ejemplo:

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

puede requerir dependencias externas, p. 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!


32
2017-10-13 09:26


origen


Respuestas:


La clase en su global.asax.cs es su Composición Root, por lo que no puede (y no debe) inyectar nada desde afuera.

Sin embargo, solo hay una instancia de la clase MvcApplication, por lo que si necesita un servicio en uno de sus métodos, puede declararlo como un campo miembro, 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");
    }
}

33
2017-10-13 09:50