我已经看过Mosh Hamedani关于EF的课程以及阅读有关MSDN的文章。我还在StackOverflow中阅读了一些讨论。但我还是不能理解它。
我正在尝试在WPF中使用Entity Framework和存储库模式。现在,无论在哪里,我都看到人们使用存储库模式,以便返回IEnumerable<>的项目。但是,由于我试图将这些绑定到需要更新的数据网格,返回ObservableCollection不是更好吗?
另外,我看了一些教程,他们盲目地删除并替换了由EF和ObservableCollection创建的实体中的ICollection和Hashset。但是,there是一个教程,它说,我引用,"使用“ObservableCollection”查找并替换第一次出现的“HashSet”。此事件大约位于第50行。请勿替换代码中稍后发现的第二次出现的HashSet。"它甚至没有解释为什么我根本不应该替换第二次出现。
有谁能告诉我如何理解哪些ICollection和Hashset可以安全地替换为ObservableCollection?
作为旁注,我在实体中引入了INotifyPropertyChanged。是否更好的做法是使用ObservableObject?
真诚地欢迎任何帮助。
答案 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上显示和编辑数据不是存储库的问题 您需要一个业务/表示层。
例如,如果您有像
这样的CustomerRepositoryclass 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(在您的业务/表示层中)