2012-06-24 33 views
1

我在ASP.NET MVC 4應用程序中使用Spring.NET的IOC容器。每個控制器從容器中得到EF的datacontext:Spring.NET IOC/MVC - 處置的數據庫上下文

private readonly IDBContext db = 
     (IDBContext) ApplicationHelper.ApplicationContext.GetObject("DatabaseContext"); 

我搭建的控制器,默認情況下,他們實現IDisposable接口,其中DB連接設置 - 這樣的:

protected override void Dispose(bool disposing) 
    { 
     this.db.Dispose(); 
     base.Dispose(disposing); 
    } 

這很好 - 我想保持這樣。但是,調用的第二個控制器會發出異常,指出數據庫上下文已處理。

所以 - 我想要做的是讓IOC容器檢查對象是否已經處置,當下一個控制器調用GetObject()方法時。這是可能的,還是應該改變我的設計?

回答

1

默認情況下,在您的spring.net Web應用程序容器中配置的對象具有"application" scope。這意味着您的實例名爲DatabaseContext只會在Web應用程序啓動時創建一次。第一個使用此實例的控制器將其部署,然後不能由任何其他控制器使用。

通常,在使用IOC容器時,自己管理對象的生命週期是一種糟糕的做法,就像您在控制器中使用dispose實現一樣。如果可能,你應該讓你的容器管理對象的生命週期。

在這種特殊情況下,使用request作用域創建DatabaseContext可能是有意義的。這樣做時,彈簧容器將在您的請求結束時處理您的DatabaseContext。這樣做時,您可以從Controller.Dispose中刪除this.db.Dispose();

最近問題IoC (spring.net) with asp.net - ctor injected non-singleton objects on controller - where do I dispose?出現了;你也可能對此感興趣。

+0

甜點 - 答案。謝謝!我添加了範圍=「請求」,並將刪除所有腳手架配置代碼,它的工作原理! –

0

看起來像在您的IoC容器設置方法中,您將IDBContext配置爲單例。

將其更改爲基於實例的IDBContext