我正在处理 中的项目WPF ,使用本地数据库(通过 SQL Express)和 Entity Framework 作为 ORM。
我想实现尽可能多的查看模型 作为 查看 类。种类 1对1关系,我听说这是实现 MVVM 的好方法(如果您不同意,请分享原因)。我对此的看法是,每个 ViewModel 都服务于它的 View(即共享模型层提供的数据库中的一些数据)。
所以每个 View 都有它的 ViewModel,它是一种仆人。 ;)
在实现这个概念的过程中,我遇到了这个问题......假设至少有 2 个 ViewModel 想要获取存储在数据库中的所有客户的最新列表。
在这种情况下我会怎么做?我必须将此代码添加到所有这些 ViewModel 中(针对 DRY ):
public ObservableCollection<Customer> Customers;
private ObservableCollection<Customer> GetAllCustomers()
{
var oc = new ObservableCollection<Customer>();
using (var db = new MyDbContext())
{
var query = from b in db.Customers
orderby b.Surname
select b;
foreach (var customer in query)
{
oc.Add(customer);
}
}
return oc;
}
或者(或者)我会做一些静态的
FooClass
使用我在上面写的相同代码,但使用 静态 .这不是很聪明,因为这样的FooClass
一段时间后会变成一堆乱七八糟的东西。我找不到任何更聪明的解决方案。我相信你知道我应该如何巧妙地编写代码。所以请帮助我。我应该如何为许多 ViewModel 提供相同的功能?
最佳答案
您应该将消费代码中的数据访问抽象到允许您的特定数据访问和/或间接访问的某个层。一个简单的分割是获取您拥有的自定义查询,将它们放在一个对象中并在您的不同 View 模型中引用该对象。
下面是一个过于简化的示例,它留下了改进的空间,但应该给你一个大致的想法,不确定下面的 viewmodel 方法有多实用,但再次为所述代码提供一个示例。
public class DataAccess {
public IEnumerable<Customer> GetCustomers() {
using (var db = new MyDbContext())
{
var query = from b in db.Customers
orderby b.Surname
select b;
return query.ToList();
}
}
}
...
private ObservableCollection<Customer> GetAllCustomers()
{
var customers = new DataAccess().GetCustomers();
return new ObservableCollection<Customer>(customers);
}
除了这个例子,你可能想要拆分
DataAccess
到处理特定数据集并可以处理客户端传递的查询条件的聚合根类中,还有其他考虑因素,例如不允许消费者使用数据实体,而是允许 DTO 或特定业务逻辑的域对象和层.总而言之,我不建议直接从您的 View 模型访问您的 EF 数据上下文,除非这只是玩具/原型(prototype)代码。
关于entity-framework - 在许多 ViewModel 中需要从数据库中获取相同类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13238565/