我有一个Web服务,它提供查询数据的接口。我正在使用MVVM编写WPF应用程序。我正在创建一个我的View Models可用于检索模型的存储库。存储库将在需要时调用Web服务来获取数据。
我需要在我的存储库中使用各种 Find 方法,这些方法根据各种标准查找数据,而不仅仅是像“Id”这样的标准。
在我的存储库中,我创建了一个以规范作为输入的Find方法
void IList<MyData> Find (ISpecification spec)
基本的ISpecification接口是
public interface ISpecification<T>
{
bool IsSatisfiedBy(T candidate);
}
Find方法的高级实现如下
我对上面的Else场景感到困惑 - 设计规范的正确方法是什么,这样如果我在存储库缓存中没有满足规范的数据,我应该能够从规范中检索标准并调用Web服务传递web方法这个标准?
我想到的一些事情 -
答案 0 :(得分:2)
为什么不使用linq表达式作为参数输入?
e.g。
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