mvvm存储库过滤

时间:2011-05-22 20:08:51

标签: c# mvvm repository-pattern iqueryable specification-pattern

我有一些主要细节类,主要基于Josh Smith的msdn article。它的优秀代码,特别是一个例子,但让我想知道如何最好地处理你想要一些存储库子集的情况。

所以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来解决这样的问题?

干杯,
Berryl

1 个答案:

答案 0 :(得分:1)

一个选项(可能是最干净的)只是将这些方法添加到CustomerRepository - 例如GetPreferredCustomers()GetLocalCustomers()

另外,你应该真的反对抽象,所以应该将ICustomerRepository传递给你的视图模型构造函数。这会将您的视图模型代码与您的具体客户存储库(在本例中是从XML文件中读取的存储库)分离,并且可以轻松地交换实现,例如,用于单元测试。

正如您所提到的,另一个选项是您的存储库公开IQueryable<T>。如果您乐意与IQueryable联系在一起,并且确信任何数据访问实现都将支持LINQ提供程序,那么这将提供良好的灵活性。有关详细信息,请参阅here

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