WPF MVVM - 存储库模式查询

标签 wpf design-patterns mvvm repository specifications

我有一个 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 方法的高级实现如下
  • 首先在缓存中搜索满足规范的候选
  • 如果找到返回候选人名单
  • 否则使用规范/标准调用 Web 服务来获取候选人并返回列表

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

    有几件事在我脑海中-
  • 如果我专门查找方法来获取具有属性/标准的专门规范,那么存储库 - 规范具有紧密耦合
  • 如果我必须直接连接到 DB(我不是),那么我可以支持一种返回 SQL 的方法。 LINQ 可能是一个选项等
  • 最佳答案

    为什么不使用 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/

    相关文章:

    c# - MVVM 根据 ComboBox 所选项目加载 View

    c# - 实例化其他类的单元测试类

    c# - 在 WPF Canvas 上的给定点居中文本

    c# - 如何在 WPF 中的 Xaml 文件中添加注释?

    c# - WPF CompositeCollection按每个 Collection View 分组

    c# - 重构设计模式 : applying adapter pattern to 3rd party API

    C++:从模板参数继承类

    c# - InvalidOperationException 未处理 - WPF 路径

    javascript - Redux 和 Angular 2

    c# - MVVM 更新源触发器