2011-10-13 30 views
31

如何注入依赖到global.asax.cs中,即MvcApplication类?如何注入依赖关系到global.asax.cs中

以前使用服务定位符(反)模式进行依赖项注入,我试图通过使用IOC容器(特别是Unity.Mvc3,因为它带有一个实现IDependencyResolver开箱即用)和构造函数注入。

除了几个障碍,其中一个在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>(); 
    } 
} 

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

+0

嗨,有趣的问题!为什么不能在OnApplicationStarted中的global.asax内注入依赖关系?如果应用程序无法启动,您会意识到这一点,因为什么都不会起作用...... – 2011-10-13 09:32:51

回答

31

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

然而,还有的MvcApplication类只有一个实例,因此,如果你在它的一个方法需要一个服务,你可以声明为一个成员字段 - e.g:

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。好东西! – 2011-10-13 10:02:30

+1

感谢您的快速回复。如果你不能注入一个模拟的例子,你如何单元测试这些方法。 ILogService? – magritte

+4

我不知道。 Composition Root是一个Humble Object(http://xunitpatterns.com/Humble%20Object.html)的例子。如果你需要从中调用复杂的逻辑,你可以委托给另一个可*单元测试的类。 –