2011-10-13 29 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)的例子。如果你需要從中調用複雜的邏輯,你可以委託給另一個可*單元測試的類。 –