2010-07-16 2 views
1

У меня есть веб-служба, которая предоставляет интерфейс для запроса данных. Я пишу приложение WPF с использованием MVVM. Я работаю над созданием репозитория, который мои модели просмотра могут использовать для извлечения моделей. При необходимости репозиторий будет вызывать веб-службу для извлечения данных.WPF MVVM - запрос шаблона репозитория

Мне понадобится различный Найти методов в моем репозитории, которые находят данные на основе различных критериев, а не только одного критерия, такого как «Id».

В моей Repository, я создал метод Find, который принимает Спецификации в качестве входных данных

void IList<MyData> Find (ISpecification spec) 

, где основной интерфейс ISpecification является

public interface ISpecification<T> 
{ 
    bool IsSatisfiedBy(T candidate); 
} 

Высокого уровня реализации внешней методы Find будет следующим:

  • первый поисковик S кэш для кандидатов, удовлетворяющих спецификации
  • Если найдено вернуть список кандидатов
  • Else использовать спецификации/критерии для вызова веб-службы для извлечения кандидатов и вернуть список

Я смущен о Следующий сценарий выше. Каков правильный способ разработки спецификации, чтобы, если у меня нет данных в кэше репозитория, который удовлетворяет спецификации, я должен получить критерии из спецификации и вызвать веб-сервис, передающий веб-метод этим критериям?

Несколько вещей, на мой mind-

  • Если я специализируюсь Найти методы принимать специальные характеристики, которые имеют свойства/из условий, то Repository - Спецификация имеет жесткой связи
  • Если бы я подключить непосредственно к БД (чего я не знаю), тогда я мог бы поддерживать метод, который возвращает SQL, например. LINQ мог бы быть опцией и т. Д.

ответ

2

Почему вы не используете выражение linq в качестве входного параметра?

например.

public class MyModel 
{ 
    public int Prop1 {get;set;} 
    public string Prop2 {get;set;} 
} 

public interface IRepository 
{ 
    T Find<T>(Expression<Func<T,object>> expression); 
} 

public class MyRepository : IRepository 
{ 
    public T Find<T>(Expression<Func<T,object>> expression) where T : class 
    { 
    //Implement your caching/ calling your web service here 
    } 
} 

Таким образом, вы могли бы назвать ваше хранилище так:

MyRepository repository = new MyRepository(); 
var model = repository.Find<MyModel>(a=> a.Prop1 == 5); 

Если вы хотите, чтобы не позволить пользователю ставить какой-либо тип INT родового аргумент, который вы могли бы иметь свои модели все наследуемые от базовый класс или impelement интерфейс, а затем изменить метод поиска на:

public T Find<T>(Expression<Func<T,object>> expression) where T : IMyModelInterface //or whatever base class you want 
+0

Спасибо, Хосе. Раньше я не использовал LINQ. Теперь мой вопрос будет переведен на: если я использую LINQ Expression в качестве параметра функции «Найти», то как преобразовать это выражение в параметры, которые требуется для метода веб-службы? Выражение, безусловно, поможет мне в кеше памяти/сбор данных, но мой главный вопрос касался вызова сценария веб-сервиса. – byte

+0

Я думаю, что самым легким было бы иметь вебсервис в дереве выражений в качестве параметра, а также реализовать IQueryable в веб-службе (например, Linq To SQL), а затем просто передать это выражение в веб-службе, а затем вы не нужно разбираться, просто прокладывая доллар. :) – Jose

+0

Спасибо. Проблема в том, что я не могу изменить веб-службу. Это также не может быть веб-службой .NET (может быть Java или C++ в unix). Таким образом, WebMethod будет чем-то вроде Строка FindMembers (string lastname, int minAge, строка city) где тип возврата - это XML как строка – byte

Смежные вопросы