Entity Framework WPF 的存储库模式

Entity Framework Repository Pattern with WPF

我观看了 Mosh Hamedani 关于 EF 的课程并阅读了 MSDN 上的文章。我还在 Whosebug 中阅读了一些关于此的讨论。但是我还是不能正确理解它。

我正在尝试将 Entity Framework 与 WPF 中的存储库模式结合使用。现在,我到处都看到人们使用存储库模式,使得它 return 是一个 IEnumerable<> 项目。但是,由于我试图将它们绑定到需要更新的数据网格,return ObservableCollection 不是更好吗?

此外,我还看了一些教程,他们在这些教程中盲目地删除了 EF 创建的实体中的 ICollection 和 Hashset,并将其替换为 ObservableCollection。但是,there 是一个教程,它说,我引用,"Find and replace the first occurrence of “HashSet” with “ObservableCollection”. This occurrence is located approximately at line 50. Do not replace the second occurrence of HashSet found later in the code." 它甚至没有解释为什么我根本不应该替换第二次出现的原因。

谁能告诉我如何理解哪些 ICollection 和 Hashset 可以安全地替换为 ObservableCollection?

附带说明一下,我在实体中引入了 INotifyPropertyChanged。使用 ObservableObject 是更好的做法吗?

真诚欢迎任何帮助。

最佳实践建议分离所有职责,最好是每个 class。存储库模式的契约 returns 类型 ObservableCollection<> 的集合没有理由。这不是需要的并且会增加不必要的开销。

为了将 UI 元素正确绑定到您的存储库模式并相应地更新数据源,我们引入了另一项职责:协调数据更新。您通常可以使用 MVVM 模式来实现此职责,其中您的视图模型将您的初始 IEnumerable<> 集合公开给视图的 ObservableCollection<> 并在触发更新时调用您的存储库。

因此,加载数据的工作流程变为:

Repository(IEnumerable<>) --[LOAD]--> ViewModel(ObservableCollection<>) --> View

更新数据的工作流程变为:

View --[UPDATE]--> ViewModel --[PROPAGATE]--> Repository

视图模型负责 ObservableCollection<>,这是 UI 层的需要,并调用存储库的正确方法(例如 repo.Save(myItem))以保持数据源更新。

你感到困惑是因为你希望一方面使用存储库模式,它应该引入抽象的概念(实现可以用任何东西代替)和 Microsoft 指南,它建议在你的应用程序之间实现强耦合数据和 UI 层。

这里的底线是要么采用 Microsoft 建议的强耦合,要么采用使用存储库模式的松散耦合解决方案。尽管如此,如果您尝试同时执行这两项操作,您最终将得到一个有漏洞的抽象,并且只会得到这两种解决方案的缺点。


编辑以建议存储库合同。

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

那么,UI层将只引用这个接口来与你的数据库进行交互。您现在可以使用任何 ORM 库来实现它,或者如果您突然需要,为什么不用 Web 服务呢。

您需要的是将 UI 与数据层分离。
存储库负责管理您的数据访问代码(read/write 到数据库)

现在,如何在 UI 上显示和编辑数据不是存储库的问题。
您需要一个 business/presentation 图层。

例如,如果您有一个像

这样的 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(在您的 Business/Presentation 层中)负责