我有一个 Web 服务,它提供了一个查询数据的接口(interface)。我正在使用 MVVM 编写 WPF 应用程序。我正在创建一个我的 View 模型可以用来检索模型的存储库。存储库将在需要时调用 Web 服务来获取数据。
我需要在我的存储库中使用各种 Find 方法来根据各种标准查找数据,而不仅仅是像“Id”这样的标准。
在我的存储库中,我创建了一个将规范作为输入的 Find 方法
void IList<MyData> Find (ISpecification spec)
一个基本的 ISpecification 接口(interface)在哪里
public interface ISpecification<T>
{
bool IsSatisfiedBy(T candidate);
}
Find 方法的高级实现如下
我对上面的 Else 场景感到困惑 - 设计规范的正确方法是什么,以便如果我在存储库缓存中没有满足规范的数据,我应该能够从规范中检索标准并调用传递的 Web 服务web方法这个标准?
有几件事在我脑海中-
最佳答案
为什么不使用 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);
如果您不想让用户将任何类型的类型放入泛型参数中,您可以让您的模型全部从基类继承或引入接口(interface),然后将 find 方法更改为:
public T Find<T>(Expression<Func<T,object>> expression) where T : IMyModelInterface //or whatever base class you want
关于WPF MVVM - 存储库模式查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263748/