如何将依赖项注入global.asax.cs

时间:2011-10-13 09:26:32

标签: asp.net-mvc-3 dependency-injection unity-container

如何将依赖项注入global.asax.cs,即MvcApplication类?

以前使用服务定位器(反)模式进行依赖注入,我试图通过使用IOC容器(特别是Unity.Mvc3,因为它附带了IDependencyResolver的实现)来遵循我最新的MVC应用程序中的最佳实践建议开箱即用)和构造函数注入。

到目前为止,除了一些障碍外,其他一切似乎都非常简单,其中一个是在global.asax.cs中(另一个是自定义属性,但是在SO上覆盖了这个问题)。

MvcApplication类中的HttpApplication事件处理程序,例如:

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

可能需要外部依赖,例如对ILogService的依赖。那么如何在不诉诸服务定位器(反)模式的情况下注入它们呢?

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

非常感谢任何帮助/建议!

1 个答案:

答案 0 :(得分:36)

你的global.asax.cs中的类是你的Composition Root,所以你不能(也不应该)从外面注入任何东西。

但是,MvcApplication类只有一个实例,所以如果你需要在其中一个方法中使用服务,你可以将它声明为成员字段 - 例如:

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");
    }
}