WPF MVVM - Шаблон репозитория запроса - PullRequest
1 голос
/ 16 июля 2010

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

Мне потребуются различные методы Find в моем хранилище, которые находят данные на основе различных критериев, а не только одного критерия, такого как "Id".

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

void IList<MyData> Find (ISpecification spec) 

где базовый интерфейс ISpecification -

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

Реализация метода Find на высоком уровне будет выглядеть следующим образом

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

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

Несколько вещей в моей голове-

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

1 Ответ

2 голосов
/ 16 июля 2010

Почему вы не используете выражение 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 в общий аргумент, все ваши модели могут наследоваться от базового класса или реализовывать интерфейс, а затем изменить метод find на:

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