2015-04-23 64 views
0

創建一個將查詢和上下文構造函數同時作爲上下文的Func和TEntity的IQueryable的Func來解決上下文生存期問題的類是一個好主意?在查詢對象上封裝上下文構造函數

例如: 在您的數據層上,如果您使用「using」語句爲每個方法使用一個上下文,則無法返回IQueryables,因爲在上下文釋放後這不會有效,這會讓您使用的:

每個表單
  • 一個上下文(這需要注射的形式背景到你的數據層)返回查詢之前)
  • 線程靜態上下文
  • 調用ToList((禁用查詢組成)

回答

1

據我記得,上下文被設計爲根據需要創建和重新創建,而不是靜態地保存在內存中(儘管我也是這樣做的)。我發現在我的類中創建一個上下文通常是很好的(比如控制器類,甚至MVC應用程序的視圖模型類),然後讓所有的方法使用它。

但是,如果您希望爲所有用戶緩存大量的靜態數據,則會將這些靜態數據保留在內存中。正如你所提到的,你只需要考慮線程。如果您只讀,則可以創建只讀鎖來訪問此數據(而不是C#lock{})。

欲瞭解更多細節,如果要靜:https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock(v=vs.110).aspx

你並不真的需要在大多數情況下處理掉 - 這是由設計 https://stackoverflow.com/a/389871/1236397

+0

具有每一個方面的問題ViewModel是你應該使你的ViewModel IDisposable,因爲它現在有一個IDisposable的引用(這是上下文),這將使你必須妥善處理你的視圖模型(太複雜)。我並不是說查詢對象應該引用上下文,而是指向返回上下文的委託,並且內部使用該委託(Func )僅在需要時創建短期上下文 – rafael

+0

爲什麼不讓GC處理它?我從來不必爲使用這種方法的視圖模型實現'IDisposable',而且我從來沒有任何問題。 –

+0

坦白地說,我之前沒有遇到任何問題,但我已經在幾個地方讀過,在提出這個問題之前,有不同的機制來創建和發佈上下文以及其實體緩存的污染,所以我在尋找用於創建並正確處理它的方法。 – rafael