2

我有一些主要基于 Josh Smith 的msdn 文章的主从课程。它的代码很棒,尤其是作为示例,但让我想知道如何最好地处理需要存储库的某个子集的情况。

所以 Josh 有一个名为 AllCustomersViewModel 的类,代码如下:

    public AllCustomersViewModel(CustomerRepository customerRepository)
    {
        if (customerRepository == null) throw new ArgumentNullException("customerRepository");

        // Populate the AllCustomers collection with CustomerViewModels.
         _allCustomers = _customerRepository
            .GetCustomers()
            .Select(cust => new CustomerViewModel(cust, _customerRepository))
            .ToList();
   }

您如何解决需要 PreferredCustomers、ExCustomers、LocalCustomers 等的情况?

他的代码向我建议了每个 ViewModel 类,并在该类中硬编码存储库的过滤。

还是一种将可选过滤器与存储库一起传递到 ViewModel 的方法?

您的代码如何解决这个特定问题?

顺便说一句,有没有人有链接或很好的例子来展示如何使用 SpeciaficationPattern 或 IQueryable 来解决这样的问题?

干杯,
贝里尔

4

1 回答 1

1

一种选择(可能是最干净的)是将这些方法简单地添加到CustomerRepository- 例如GetPreferredCustomers()GetLocalCustomers()等。

此外,您确实应该反对抽象,因此应该将 an 传递ICustomerRepository给您的视图模型构造函数。这将您的视图模型代码与您的具体客户存储库(在本例中是从 XML 文件读取的存储库)分离,并使得交换实现变得容易,例如用于单元测试。

正如您所提到的,另一个选项是让您的存储库公开IQueryable<T>. 如果您很高兴与 IQueryable 绑定,并且确信任何数据访问实现都将支持 LINQ 提供程序,那么这将提供很好的灵活性。请参阅此处了解更多信息。

就个人而言,我更喜欢第一种选择,特别是对于更大规模的应用程序。

于 2011-05-23T09:01:29.720 回答