簡體   English   中英

使用WPF的實體框架存儲庫模式

[英]Entity Framework Repository Pattern with WPF

我看過Mosh Hamedani關於EF的課程以及閱讀有關MSDN的文章。 我還在StackOverflow中閱讀了一些討論。 但我還是不能理解它。

我試圖在WPF中使用Entity Framework和存儲庫模式。 現在,在任何地方,我都看到人們使用存儲庫模式,以便返回IEnumerable <>項。 但是,由於我試圖將這些綁定到需要更新的數據網格,因此返回ObservableCollection不是更好嗎?

另外,我觀察了一些教程,他們盲目地刪除並替換了EF和ObservableCollection創建的實體中的ICollection和Hashset。 但是, 一個教程,它說,並且我引用“查找並用”ObservableCollection“替換第一次出現的”HashSet“。這個事件大約位於第50行。不要替換后面發現的第二次出現的HashSet編碼。” 它甚至沒有解釋為什么我根本不應該替換第二次出現。

任何人都可以告訴我如何理解哪個ICollection和Hashset可以安全地替換為ObservableCollection?

作為旁注,我在實體中引入了INotifyPropertyChanged。 使用ObservableObject是更好的做法嗎?

真的歡迎任何幫助。

最佳實踐建議將所有職責分開,最好每班一次。 沒有理由存儲庫模式的契約返回ObservableCollection<>類型的集合。 這不是必需的,並增加了不必要的開銷。

為了將UI元素正確綁定到存儲庫模式並相應地更新數據源,我們引入了另一個職責:協調數據更新。 您通常可以使用MVVM模式實現此職責,其中視圖模型將您的初始IEnumerable<>集合暴露給您的視圖的ObservableCollection<> ,並在觸發更新時調用您的存儲庫。

因此,加載數據的工作流程變為:

存儲庫( IEnumerable<> ) - [LOAD] - > ViewModel( ObservableCollection<> ) - >查看

並且更新數據的工作流程變為:

查看 - [更新] - > ViewModel - [PROPAGATE] - >存儲庫

視圖模型負責處理ObservableCollection<> ,它需要UI層並調用存儲庫的正確方法(例如repo.Save(myItem) )以保持數據源的更新。

您感到困惑,因為您希望一方面使用存儲庫模式,它應該引入一個抽象概念(實現可以被任何東西替換)和Microsoft指南,它建議實現數據和UI層之間的強耦合。

這里的底線要么是微軟建議的強耦合,要么是使用存儲庫模式的松散耦合解決方案。 盡管如此,如果你試圖同時做這兩者,你最終會得到一個漏洞抽象,只能得到兩個解決方案的缺點。


編輯以建議存儲庫的合同。

public interface ItemsRepository
{
   IEnumerable<Item> GetAll();
   void Update(Item item);
}

然后,UI層將僅引用此接口以與您的數據庫進行交互。 您現在可以使用任何ORM庫實現它,或者如果您突然需要,為什么不能使用Web服務。

您需要的是將UI與數據層分離。
存儲庫負責管理您的數據訪問代碼(讀/寫數據庫)

現在,如何在UI上顯示和編輯數據不是存儲庫的問題。
您需要一個業務/表示層。

例如,如果您有CustomerRepository之類的

class CustomerRepository
{
    public IEnumerable<Customer> GetCustomers()
    {
         return yourContext.Customers.ToList();
    }
}

你可以創建一個像這樣的服務

class CustomerService
{
    public ObservableCollectionOf<Customer> GetCustomers()
    {
         var customers=new CustomerRepository().GetCustomers().OrderBy...;
         return new ObservableCollectionOf(customers);
    }
}

您不必,也可能不應該在您的實體上使用UI(InotifyPropertyChanged,Observables)相關代碼。

創建負責該操作的ViewModel(在您的業務/表示層中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM