У меня есть веб-сервис, который обеспечивает интерфейс для запросов данных. Я пишу приложение WPF с помощью MVVM. Я работаю над созданием репозитория, который мои Модели Представления могут использовать для получения моделей. Репозиторий назовет веб-сервис для выборки данных при необходимости.
Я потребовал бы различных методов Находки в своем репозитории, который находит данные на основе различных критериев и не всего критериев как 'идентификатор'.
В моем Репозитории я создал метод Находки, который берет Спецификацию в качестве входа
void IList<MyData> Find (ISpecification spec)
где основной интерфейс ISpecification
public interface ISpecification<T>
{
bool IsSatisfiedBy(T candidate);
}
Высокий уровень implemenation метода Находки был бы следующие
Я Еще смущен сценарий выше - Каков корректный способ разработать Спецификацию так, чтобы, если у меня нет данных в кэше репозитория, который удовлетворяет спецификацию, я смог получить критерии от спецификации и назвать веб-сервис, передающий веб-метод это критерии?
Несколько вещей на моем уме -
Почему бы вам не использовать выражение 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