6

我遇到了一個相當毛茸茸的問題。這可能有一個簡單的解決方案,但我找不到它!在HttpHandler中使用IoC進行構造師/注入者注入,有可能嗎?

我有一個自定義的HttpHandler,我想處理請求,記錄某些信息,然後在數據庫中輸入詳細信息。我正在使用NUnit和Castle Windsor。

所以我有兩個接口;一個用於記錄其他數據輸入,這是注入的構造函數。我很快發現無法調用構造函數,因爲總是調用默認的無參數構造函數。

所以我想我會使用Setter注入並讓Castle windsor把它整理出來。當我使用container.Resolve<CustomHttpHandler>();時,我可以檢查記錄器是否爲空。 (在Global.asax.cs中的Application_Start中)

問題是雖然Castle Windsor可以創建http應用程序不使用它的實例?我認爲??

基本上這樣做的全部原因是能夠通過模擬和單元測試隔離測試記錄器和數據存儲庫代碼。

任何想法,我可以去解決這個問題?

謝謝!

+0

馬特,改變你的問題並不酷,因爲你使所有現有的答案無效,你強迫每個人都更新。請恢復您的修改並改爲創建一個新問題。 – 2010-08-23 12:34:51

+0

嗨Mauricio。對不起,顯然我對這是如何工作的新手。已經回覆並創建了一個新問題。謝謝! – Matt 2010-08-23 21:11:26

回答

2

不可能,至少不是直接的。 IHttpHandler對象由ASP.NET運行時實例化,它不允許Windsor參與創建。您可以:

  • 通過將容器用作服務定位器來拉取依賴關係。
  • 設置創建成熟,注射和代表,以自己的處理程序一個基本處理程序(見如何Spring does it
  • 使用容器作爲該處理所有的請求其他服務的服務定位器(如saret explained
+0

當,我有一種感覺可能是這種情況。你能否解釋一下你的第一點:通過使用容器作爲服務定位器來拉取依賴關係。謝謝! – Matt 2010-08-20 01:25:16

+0

@Matt:從你的HttpHandler中調用容器來獲取你需要的任何依賴。 – 2010-08-20 02:26:32

+0

感謝Mauricio的回覆。明白! – Matt 2010-08-22 21:45:19

2

你可以做的是讓HttpHandler調用另一個實際處理請求的對象。所以在你的HttpHandler的ProcessRequest方法中,你會這樣做:

public void ProcessRequest(HttpContext context) 
{ 
var myHandlerObject = container.Resolve<HandlerObject>(); 
myHandlerObject.ProcessRequest(context or some state/info that is required) 
} 
+0

嗨。感謝這個想法。這可能是解決方案,Mauricio的其他選擇之一。謝謝! – Matt 2010-08-20 01:23:19

相關問題