2011-07-25 86 views
1

我在Global.ascx中綁定了DonorContext類的一個對象(它來源於EntityFramework的DbContext),如下所示。在Ninject中處理綁定對象

kernel.Bind<DonorContext>().ToSelf().InRequestScope().OnDeactivation(DisposeDonorContext); 

我期待在請求結束時,Ninject會調用DisposeDonorContext方法。但它永遠不會被調用。

我可以從網上收集的是IDisposible類型的對象在超出範圍時會自動獲取其Dispose方法。這不是在我的情況發生,因此我正在嘗試OnDeactivation()來處置DonorContext(這也不會發生)。

任何想法爲什麼處置不會發生?

回答

2

Ninject會自動調用實現IDisposable的對象的Dispose方法(至少這是我使用最新版本測試時發生的情況)。如果這種情況不會發生在您身上,我懷疑問題在於您從未在您的應用程序的任何地方使用這個DonorContext。所以它永遠不會被實例化,永遠不會被處置。例如,如果你有一個控制器,採用此背景下爲構造函數的參數:

public class HomeController: Controller 
{ 
    private readonly DonorContext _context; 
    public HomeController(DonorContext context) 
    { 
     _context = context; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

它應該工作。如果您有一個將此上下文作爲構造函數參數的服務層,然後在控制器中使用此服務(使用構造函數注入),它也可以工作。在一天結束時,您必須擁有一個控制器,該控制器採用一些依賴性,該依賴性本身可能是DonorContext或其他依賴於依賴於DonorContext(存儲庫,服務,...)的依賴項以觸發依賴注入鏈。

這就是說,在您的控制器中使用具體類型如DonorContext,因爲您在對它進行硬編碼時使用依賴注入的目的。

+0

達林,其實我在我的控制器注入服務層對象UserManager。這個UserManager對象包含DonorContext依賴。我正在使用[Inject]屬性來注入依賴關係。 UserManager的作用域是默認的ninject範圍。我確信DonorContext對象被創建並注入我的服務層,因爲我正在使用它來加載正確發生的數據。 – Jatin

+0

達林,我剛剛安裝了Ninject.MVC3軟件包,現在我可以看到OnDeactivation()調用我的方法。謝謝你的幫助。 – Jatin

+3

+1,一切都是真實和正確的,但只是想明確表示它是Ninject的System.Web集成體現在Ninject.MVC3中,它將這種情況聯繫起來 - 捕獲Ninject中的所有處理都是GC觸發的緩存和收集機制,根據您的託管上下文可能會導致OP的觀察到的問題重新取消激活不直接發生在ASP.NET處理週期的適當位置 –