Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF MVVM-存储库模式查询_Wpf_Design Patterns_Mvvm_Repository_Specifications - Fatal编程技术网

WPF MVVM-存储库模式查询

WPF MVVM-存储库模式查询,wpf,design-patterns,mvvm,repository,specifications,Wpf,Design Patterns,Mvvm,Repository,Specifications,我有一个web服务,它提供了一个查询数据的接口。我正在使用MVVM编写一个WPF应用程序。我正在创建一个存储库,我的视图模型可以用来检索模型。当需要时,存储库将调用Web服务来获取数据 我需要在我的存储库中使用各种查找方法,这些方法根据各种标准查找数据,而不仅仅是像“Id”这样的一个标准 在我的存储库中,我创建了一个Find方法,该方法将规范作为输入 void IList<MyData> Find (ISpecification spec) 无效IList查找(ISpecific

我有一个web服务,它提供了一个查询数据的接口。我正在使用MVVM编写一个WPF应用程序。我正在创建一个存储库,我的视图模型可以用来检索模型。当需要时,存储库将调用Web服务来获取数据

我需要在我的存储库中使用各种查找方法,这些方法根据各种标准查找数据,而不仅仅是像“Id”这样的一个标准

在我的存储库中,我创建了一个Find方法,该方法将规范作为输入

void IList<MyData> Find (ISpecification spec) 
无效IList查找(ISpecification规范)
其中,基本ISpecification接口是

public interface ISpecification<T>
{
    bool IsSatisfiedBy(T candidate);
}
公共接口规范
{
布尔是满意的(T候选人);
}
Find方法的高级实现如下

  • 首先在缓存中搜索满足规范的候选对象
  • 如果找到,请返回候选人名单
  • 否则,使用规范/标准调用web服务以获取候选对象并返回列表
我对上面的Else场景感到困惑——设计规范的正确方法是什么?这样,如果我的存储库缓存中没有满足规范的数据,我应该能够从规范中检索标准,并调用传递此标准的web方法的web服务

我脑子里有几件事-

  • 如果我专门寻找方法来获取具有属性/标准的专门规范,那么存储库规范具有紧密耦合
  • 如果我必须直接连接到DB(我不是),那么我可以支持一个返回SQL的方法。LINQ可能是一种选择,等等

    • 为什么不使用linq表达式作为参数输入

      e、 g

      公共类MyModel
      {
      公共int Prop1{get;set;}
      公共字符串Prop2{get;set;}
      }
      公共接口假定
      {
      T-Find(表达式);
      }
      公共类MyRepository:IRepository
      {
      公共T查找(表达式),其中T:class
      {
      //在此处实现缓存/调用web服务
      }
      }
      
      因此,您可以这样调用存储库:

      MyRepository repository = new MyRepository();
      var model = repository.Find<MyModel>(a=> a.Prop1 == 5);
      
      MyRepository repository=newmyrepository();
      var model=repository.Find(a=>a.Prop1==5);
      
      如果不允许用户将任何类型的int置于泛型参数中,则可以让模型都从基类或接口继承,然后将find方法更改为:

      public  T Find<T>(Expression<Func<T,object>> expression) where T : IMyModelInterface //or whatever base class you want
      
      public T-Find(Expression-Expression)where T:IMyModelInterface//或任何您想要的基类
      
      谢谢你,何塞。我以前没有用过LINQ。我的问题现在可以转化为,如果我使用LINQ表达式作为参数来查找函数,那么如何将该表达式转换为Web服务方法所需的参数?表达式肯定会对我的内存缓存/数据收集有所帮助,但我的主要问题是关于调用web服务场景。我认为最简单的方法是让web服务也将表达式树作为参数,在web服务中实现IQueryable(即Linq到SQL)然后只需在web服务中为其提供表达式,就不必进行任何解析,只需将责任推给它即可。:)谢谢问题是我无法修改web服务。它也可能不是.NET Web服务(可以是java或C++在UNIX上)。因此WebMethod类似于string FindMembers(string lastname、int minAge、string city),其中返回类型为XML as Strings。我认为最好的选择是使存储库具有与web服务相同的方法,然后在每次调用后将结果缓存到存储库中。感谢您的回复。
      public  T Find<T>(Expression<Func<T,object>> expression) where T : IMyModelInterface //or whatever base class you want