2012-06-12 82 views
1

這個問題Ninject Dependency Injection in MVC3 - Outside of a Controller與我正在經歷的接近,但並不完全。在MVC3控制器之外調用Ninject時,HttpContext爲null

我有一個ASP.NET MVC3網站使用Ninject 3,它奇妙的構造函數注入。我的所有依賴項都已解決,包括那些通過HttpContext.Current傳遞的依賴項。

我的問題是,在global.asax中,我啓動了一個TaskManager類,該類定期對定時器執行一些任務。在任務管理器類中,我沒有控制器,所以如果我需要訪問我的一個依賴(像我的錯誤日誌服務),我使用有權限訪問內核對象的靜態包裝類:

var logger = MyContainer.Get<ILoggingService>(); 
logger.Error("error doing something...", ex); 

.Get方法只執行一個內核。獲取調用來解析我的依賴關係。每次我在其他依賴項上使用此方法時都很好用。然而,ILoggingService有一個名爲MyWebHelper的依賴項,通過它的構造函數注入,並在其構造函數中包含HttpContext。

public class DefaultLogger : ILoggingService 
    {  
     public DefaultLogger(IRepository<Log> logRepository, IWebHelper webHelper) 
     { 
      _logRepository = logRepository; 
      _webHelper = webHelper; 
     } 
    } 

    public class MyWebHelper : IWebHelper 
    { 
     public MyWebHelper(HttpContext httpContext) 
     { 
      _httpContext = httpContext; 
     } 
    } 

在我的網站的其餘部分,這是因爲所有的依賴注入我的MVC控制器的所有工作得很好。但是,如果我手動調用我的靜態包裝類來以這種方式獲得我的依賴關係,那不起作用。我得到的錯誤:

Error activating HttpContext using binding from HttpContext to method

Provider returned null.

所以,它不給我一個HttpContext,就像它在我的MVC應用程序的其餘部分一樣。我希望這是有道理的,我不是一個ninject專家還,但我想...

回答

3

My issue is that in global.asax, I kick off a TaskManager class that periodically performs some tasks on a timer.

這是一個糟糕的主意,因爲菲爾哈克explains in details。不要在您的Web應用程序中執行此操作。這些循環任務應該在單獨的應用程序中完成(Windows服務或定期運行的某個控制檯應用程序)。

現在的事情是,你正在運行後臺線程。這些後臺線程運行在任何用戶HTTP請求之外,因此HttpContext.Current在它們內部顯然是空的。因此,即使您沒有遵循Phil Haack的建議並繼續在ASP.NET應用程序中運行後臺任務,您也必須重新構建您的方法,以便它不再依賴於任何HttpContext,因爲在後臺線程中沒有這樣的事情。

+0

謝謝你的留言!我正在執行的任務主要是清理類型任務和發送已排隊的電子郵件。 NopCommerce做了非常相似的事情,這是我的想法。他們非常簡短。我理解關於HttpContext的評論。當然,這是不可用的:)我的解決方法是創建另一個版本的ILoggingService,沒有注入包括HttpContext.Current的依賴關係。如果它在發現空HttpContext時不會炸燬它,那將是非常棒的。 – ScottG