Я ищу рекомендации по абстрагированию контекста моего домена RIA от моделей представления, чтобы сделать их независимыми от источника данных.Похоже, лучшее решение, которое я могу найти, - это шаблон сервисного агента, описанный здесь .Однако, что если у меня есть относительно сложная логика запросов для выполнения?
Например, в настоящее время у меня есть контексты моего домена в моих моделях представления.Допустим, у меня есть 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)
но представьте, если бы мои поисковые запросы были еще более сложными - этот интерфейс стал бы громоздким.Есть ли лучшая альтернатива, каким-то образом я мог бы построить запрос в ВМ, как я делаю с контекстом домена?Или я должен просто смириться с этим и использовать некоторые объекты параметров?
Я бы очень предпочел иметь возможность создавать запросы на ВМ, потому что в настоящее время у меня есть небольшая иерархия ВМ, которые все выполняют различные поиски, используябазовый класс поиска и шаблонный метод для генерации запросов, вроде

Невозможность генерировать запросы от клиента вызовет много дублирования кода, который я исправил с помощью этогоструктура наследования.