1

我正在WPF中的项目上工作,使用本地数据库(通过SQL Express)和Entity Framework作为ORM

我想实现与 View 类一样多ViewModel 一种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提供相同的功能?

4

1 回答 1

1

您应该将消费代码中的数据访问抽象到允许您的特定数据访问和/或间接访问的某个层。一个简单的细分是获取您拥有的自定义查询,将它们放在一个对象中并在您的不同视图模型中引用该对象。

下面是一个过于简化的示例,它留下了改进的空间,但应该给你一个大致的想法,不确定下面的 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或特定业务逻辑的域对象和层。总而言之,我不建议直接从您的视图模型访问您的 EF 数据上下文,除非这只是玩具/原型代码。

于 2012-11-05T19:12:57.143 回答