我正在寻找有关从我的视图模型中抽象出我的RIA域上下文的最佳实践,以使它们与数据源无关。似乎我能找到的最佳解决方案是here所描述的服务代理模式。但是,如果我有一些相对复杂的查询逻辑来执行怎么办?
例如,目前我的视图模型中有我的域上下文。我们假设我有一个ContactSearchViewModel,其中构建搜索查询涉及一些逻辑:
protected EntityQuery<Contact> CreateSearchQuery()
{
var query = Context.GetContactsQuery().Where(
e => e.First_Name.ToLower().StartsWith(FirstNameSearch.ToLower()) &&
e.Last_Name.ToLower().StartsWith(LastNameSearch.ToLower()));
if (!string.IsNullOrEmpty(Phone))
{
query = query.Where(q => q.Phone == Phone ||
q.Mobile == Phone ||
q.Work == Phone);
}
if (SelectedContactType == "Prospect")
{
query = query.Where(q => q.Contact_Type_Id == 1);
}
else if (SelectedContactType == "Customer")
{
query = query.Where(q => q.Contact_Type_Id == 2);
}
return query;
}
现在我可以使用一个服务代理方法,其签名看起来像public EntityList<Contact> SearchContacts(string firstName, string lastName, string phone, ContactType contactType)
,但想象一下如果我的搜索查询更复杂 - 这个界面会变得难以处理。有没有更好的选择,有些方法我可以在VM中构建查询,就像我对域上下文一样?或者我应该吮吸它并使用一些参数对象?
我非常希望能够在VM上构建查询,因为我目前有一个小的VM层次结构,它们都使用基本搜索类和模板方法执行各种搜索,以生成查询,类似于
无法从客户端生成查询会导致我使用此继承结构修复的大量代码重复。
答案 0 :(得分:1)
我建议查看Repository模式。它是DDD的一部分,但在任何架构中都有应用,IMO。它的目的是容纳查询逻辑。
给VM对象查询逻辑看起来很脏,除非那是他们的single purpose。