WPF MVVM - 存储库模式查询

时间:2010-07-16 10:04:38

标签: wpf design-patterns mvvm repository specifications

我有一个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方法的高级实现如下

  • 首先在缓存中搜索满足规范的候选者
  • 如果找到则返回候选人名单
  • 否则,请使用规范/条件来调用Web服务以获取候选项并返回列表

我对上面的Else场景感到困惑 - 设计规范的正确方法是什么,这样如果我在存储库缓存中没有满足规范的数据,我应该能够从规范中检索标准并调用Web服务传递web方法这个标准?

我想到的一些事情 -

  • 如果我专门使用Find方法来获取具有属性/标准的专用规范,那么Repository - Specification具有紧耦合
  • 如果我必须直接连接到DB(我不是),那么我可以支持一个返回SQL的方法。 LINQ可能是一个选项等

1 个答案:

答案 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