我有一些主要细节类,主要基于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
答案 0 :(得分:1)
一个选项(可能是最干净的)只是将这些方法添加到CustomerRepository
- 例如GetPreferredCustomers()
,GetLocalCustomers()
等
另外,你应该真的反对抽象,所以应该将ICustomerRepository
传递给你的视图模型构造函数。这会将您的视图模型代码与您的具体客户存储库(在本例中是从XML文件中读取的存储库)分离,并且可以轻松地交换实现,例如,用于单元测试。
正如您所提到的,另一个选项是您的存储库公开IQueryable<T>
。如果您乐意与IQueryable联系在一起,并且确信任何数据访问实现都将支持LINQ提供程序,那么这将提供良好的灵活性。有关详细信息,请参阅here。
就个人而言,我更喜欢第一种选择,特别是对于大规模应用。