WPF MVVM - Запрос шаблона репозитория

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

Я потребовал бы различных методов Находки в своем репозитории, который находит данные на основе различных критериев и не всего критериев как 'идентификатор'.

В моем Репозитории я создал метод Находки, который берет Спецификацию в качестве входа

void IList<MyData> Find (ISpecification spec) 

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

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

Высокий уровень implemenation метода Находки был бы следующие

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

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

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

  • Если я специализируюсь, Находят, что методы берут специализированные спецификации, которые имеют свойства / criterias затем Репозиторий - Спецификация имеет плотное соединение
  • Если я должен был бы соединиться непосредственно с DB (который я не), затем, я, возможно, поддерживал метод, который возвращает SQL, например. LINQ, возможно, был опцией и т.д.
1
задан byte 16 July 2010 в 11:19
поделиться

1 ответ

Почему бы вам не использовать выражение 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);

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

public  T Find<T>(Expression<Func<T,object>> expression) where T : IMyModelInterface //or whatever base class you want
2
ответ дан 2 September 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: