2011-03-10 117 views
0

我對存儲庫模式很陌生,但到目前爲止,我喜歡我如何使用它。我在Codeplex上發現了這個implementation。我現在的問題是:如何使用數據存儲庫

我是否正確使用存儲庫模式?

誰能提供下我的例子更好的解決方案?

這裏是一個例子(我使用poco),在那裏我已經在過程中提前關閉了一個關閉的位置。一些UI交互後,我要更新的位置屬性(如姓名)和相關的用戶(包括添加和刪除):


using (var repo = RepositoryHelper.GetLocationRepository()) 
using (var repo2 = RepositoryHelper.GetUserRepository(repo.UnitOfWork)) 
{ 
    repo.Add(location); 
    repo.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(location, EntityState.Modified); 

    foreach (var user in location.Users) 
    { 
     repo2.Add(user); 
     if (user.Id != 0) 
     { 
      repo2.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(user, EntityState.Unchanged); 
     } 
    } 

    foreach (var user in _remove.Where(user => user.Id != 0)) 
    { 
     repo2.Delete(user); 
    } 

    repo2.UnitOfWork.Commit(); 
} 

的例子是工作,雖然我如何到了很迷茫附加命令。如果對象來自另一個環境,我認爲它會被使用?!但是,如果我嘗試,我總是會得到一個異常,該對象正在被另一個上下文使用。並且可以說,我正在分離位置,之後我無法訪問Users集合。

另一個問題(我認爲它與此密切相關):我一直在讀,數據庫連接應儘可能短。因此,我將IDisposable接口添加到存儲庫,所以我可以像ObjectContext一樣使用它們。然而,我發現了一些例子(我認爲也在wpf應用程序框架中),這不是通常的方法。那麼,我應該遵循什麼樣的話?

親切的問候,

亞光

回答

1

關鍵的問題:你想用的工作(UOW)模式庫和單位爲什麼呢?

人們通常使用這些模式將EF代碼分離到內部存儲庫和UoW實現。因爲上層將完全獨立於EF。

你的實現不提供這種分離。這只是一個奇怪的包裝ObjectContextObjectSet。在這種情況下,您根本不需要存儲庫和UoW,您可以直接使用EF類。即使使用EF類,您仍然可以使您的代碼可測試(人們有時引入存儲庫和UoW的另一個錯誤原因)。

回答第二個問題。 ObjectContext的生存時間應儘可能短,但這並不意味着您應爲每個查詢創建新的上下文。 ObjectContext內部處理連接,僅在需要時纔打開它。爲什麼ObjectContext應該在短時間內使用的原因是它也實現了UoW模式,另外還有IdentityMap模式(我描述的含義here)。在WPF應用程序ObjectContext通常只要窗口或控件呈現數據進行修改。

+0

我需要一點時間來思考第一部分。但關於第二個:這意味着,可以在視圖模型的構造函數中創建一個上下文(並且在處理視圖模型時進行處理)是可以的? – Matthias 2011-03-10 13:38:14

+0

我們在談論WPF嗎?如果是這樣,我不能回答它,因爲我不是WPF開發人員,我從來沒有使用過WPF或MVVM。但是,如果將常見的WinForms與MVP(模型 - 視圖 - 演示者)模式結合使用,最佳做法是爲每個演示者提供單個上下文。 – 2011-03-10 13:40:22

+0

第一部分:對不起,但我有點困惑。我想強調,這是我第一次使用存儲庫模式,所以上面的代碼只是我的一個起點。我認爲你的意思是說我正在使用國家經理?除了我發現的所有樣本都以某種方式使用存儲庫。 – Matthias 2011-03-10 13:43:54