WPF MVVM-存储库模式查询
我有一个web服务,它提供了一个查询数据的接口。我正在使用MVVM编写一个WPF应用程序。我正在创建一个存储库,我的视图模型可以用来检索模型。当需要时,存储库将调用Web服务来获取数据 我需要在我的存储库中使用各种查找方法,这些方法根据各种标准查找数据,而不仅仅是像“Id”这样的一个标准 在我的存储库中,我创建了一个Find方法,该方法将规范作为输入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
void IList<MyData> Find (ISpecification spec)
无效IList查找(ISpecification规范)
其中,基本ISpecification接口是
public interface ISpecification<T>
{
bool IsSatisfiedBy(T candidate);
}
公共接口规范
{
布尔是满意的(T候选人);
}
Find方法的高级实现如下
- 首先在缓存中搜索满足规范的候选对象
- 如果找到,请返回候选人名单
- 否则,使用规范/标准调用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