Asp.net mvc 3 如何将依赖项注入global.asax.cs

Asp.net mvc 3 如何将依赖项注入global.asax.cs,asp.net-mvc-3,dependency-injection,unity-container,Asp.net Mvc 3,Dependency Injection,Unity Container,如何将依赖项注入global.asax.cs,即mvcapapplication类 在以前使用服务定位器(反)模式进行依赖注入之后,我试图在最新的MVC应用程序中遵循最佳实践建议,使用IOC容器(特别是Unity.Mvc3,因为它附带了IDependencyResolver现成的实现)和构造函数注入 到目前为止,一切似乎都很简单,除了几个障碍,其中一个是global.asax.cs(另一个是自定义属性,但aleady有一个关于如何覆盖它的问题) MVCAPApplication类中的HttpAp

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

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

到目前为止,一切似乎都很简单,除了几个障碍,其中一个是global.asax.cs(另一个是自定义属性,但aleady有一个关于如何覆盖它的问题)

MVCAPApplication类中的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>();
    }
}
专用静态ILogService日志服务
{
得到
{
返回DependencyResolver.Current.GetService();
}
}

非常感谢任何帮助/建议

global.asax.cs中的类是您的,因此您不能(也不应该)从外部向其中注入任何内容


但是,MVCAPApplication类只有一个实例,因此,如果您在其方法中需要一个服务,您可以将其声明为成员字段-例如:

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

嗨,有趣的问题!为什么不能在OnApplicationStarted中的global.asax中注入依赖项?如果应用程序无法启动,你会意识到这一点,因为一切都不起作用…谢谢你的快速回复标记。如果你不能注入一个模拟的实例,比如ILogService,你怎么对这些方法进行单元测试呢。组合根是谦逊对象()的一个示例。如果您需要从它调用复杂逻辑,您可以委托给另一个可以进行单元测试的类。嗯,您在博客上说“DI容器应该只从组合根引用。所有其他模块都不应该引用容器。”。这不是给了我调用resolve的自由吗,只要它在composition根目录中,也就是说,我的代码就可以了吗?在这里,您的示例让我感到困扰的一件事是您对this.log=new MyLogService()的调用。既然我们已经在这一点上初始化了容器,那么为什么不使用它呢?如果我们想把ILogService换成另一个,我们只需要在一个地方更改它,容器。我应该补充一点,我已经听从了你的建议,我的global.asax.cs现在已经进行了大规模的优化,谢谢:-)“MVCAPApplication类只有一个实例”是完全错误的-每个并行处理的请求都有一个HttpApplication实例。请注意,不会对每个新创建的实例调用Application_Start,而是对每个正在运行的web应用程序只调用一次。关于此的优秀博客文章: