2011-03-30 70 views
3

我讀過一些關於在實體框架中創建通用資源庫的文章。在每一篇文章的ObjectContext的是作爲參數傳遞給構造是這樣的:實體框架通用資源庫生命週期

public Repository(ObjectContext context) 
{ 
    _context = context; 
} 

在Web應用程序來處理ObjectContext的生活方式是每個Web請求的首選方式。這意味着如果在Web環境中使用這些存儲庫,則每個Web請求也必須具有生活方式。這擴展到服務使用存儲庫,並進一步如果我們堅持構造注入...

我認爲ObjectContext的生命週期應該在倉庫外處理,例如在HttpModule中。 我還想將存儲庫作爲單例處理,然後ObjectContext不能在構造函數中注入。必須使用另一種將ObjectContext獲取到存儲庫中的機制,就像ObjectContextFactory一樣。

用單身人士的生活方式處理儲存庫的缺點是什麼?

回答

0

與其他任何對象一樣,存儲庫是singleton的一個問題是確定存儲庫的依賴關係變得更加困難。當您需要在構造函數中傳遞一個上下文時,該上下文是ObjectContext類的依賴關係的明確聲明。如果您要使用靜態工廠來獲取對象上下文的引用,那麼有必要查看存儲庫的實現以瞭解其如何使用工廠。

通過使用依賴注入庫(例如Autofac),實現所需內容的常用方法,即管理資源庫之外ObjectContext類的範圍的功能。您可以註冊ObjectContext類,以便爲每個HTTP請求創建一個新實例。然後,如果您還註冊存儲庫類,則在請求存儲庫時,依賴注入容器將嘗試獲取對ObjectContext依賴項的引用。由於每個HTTP請求只會創建一個ObjectContext實例,因此該範圍內的多個存儲庫將接收相同的實例。 Autofac頁面有一個與ASP.NET集成的例子,你可以看看。

+0

但問題是,當您在容器中註冊ObjectContext和生活方式到PerWebRequest時,存儲庫還必須註冊PerWebRequest/Transient生活方式,因爲它們在構造函數中注入了ObjectContext。 – Marcus 2011-03-30 22:14:01

+0

存儲庫具有每個請求生命期的問題是什麼? – eulerfx 2011-03-30 23:07:41

+0

使用構造函數注入使用存儲庫的所有其他類也必須具有每個請求的生存期。 – Marcus 2011-03-31 06:06:30

相關問題