使用WPF的实体框架存储库模式

时间:2017-03-13 23:23:17

标签: c# wpf entity-framework repository-pattern observablecollection

我已经看过Mosh Hamedani关于EF的课程以及阅读有关MSDN的文章。我还在StackOverflow中阅读了一些讨论。但我还是不能理解它。

我正在尝试在WPF中使用Entity Framework和存储库模式。现在,无论在哪里,我都看到人们使用存储库模式,以便返回IEnumerable<>的项目。但是,由于我试图将这些绑定到需要更新的数据网格,返回ObservableCollection不是更好吗?

另外,我看了一些教程,他们盲目地删除并替换了由EF和ObservableCollection创建的实体中的ICollection和Hashset。但是,there是一个教程,它说,我引用,"使用“ObservableCollection”查找并替换第一次出现的“HashSet”。此事件大约位于第50行。请勿替换代码中稍后发现的第二次出现的HashSet。"它甚至没有解释为什么我根本不应该替换第二次出现。

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

作为旁注,我在实体中引入了INotifyPropertyChanged。是否更好的做法是使用ObservableObject?

真诚地欢迎任何帮助。

2 个答案:

答案 0 :(得分:3)

最佳实践建议将所有职责分开,最好每班一次。存储库模式的契约没有理由返回类型ObservableCollection<>的集合。这不是需要并增加了不必要的开销。

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

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

  

存储库(IEnumerable<>) - [LOAD] - &gt; ViewModel(ObservableCollection<>) - &gt;图

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

  

查看 - [更新] - &gt; ViewModel - [PROPAGATE] - &gt;存储库

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

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

这里的底线要么是微软建议的强耦合,要么是使用存储库模式的松散耦合解决方案。尽管如此,如果你试图同时进行这两项工作,你最终会得到一个漏洞抽象,只能解决这两个解决方案的缺点。

编辑以建议存储库的合同。

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

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

答案 1 :(得分:0)

您需要的是将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(在您的业务/表示层中)