2010-07-16 78 views
1

我有一個Web服務,它提供了一個接口來查詢數據。我正在使用MVVM編寫WPF應用程序。我正在創建一個我的View Models可以用來檢索模型的存儲庫。需要時,存儲庫將調用Web服務來獲取數據。WPF MVVM - 存儲庫模式查詢

我會要求各種在我的資源庫中查找方法,該方法根據各種標準找到數據,而不僅僅是像'Id'這樣的一個標準。

以我庫,我已經創建一個查找方法,它接受規格作爲輸入

void IList<MyData> Find (ISpecification spec) 

其中基本ISpecification接口是

public interface ISpecification<T> 
{ 
    bool IsSatisfiedBy(T candidate); 
} 

查找方法的高水平的實行將如下

  • 第一次搜索■對於符合規範
  • 如果發現考生緩存返回候選人名單
  • 否則使用該規範/標準來調用Web服務來獲取考生和返回列表

我感到困惑的上面的情況 - 設計規範的正確方法是什麼,以便如果我沒有滿足規範的存儲庫緩存中的數據,我應該能夠從規範中檢索條件並調用通過web方法的Web服務此條件?

我mind-

  • 如果我專門找到方法來採取具有性能/指標分析,然後專門倉庫規格有幾件事情 - 規格有緊耦合
  • 如果我必須要直接連接到數據庫(我不是),那麼我可以支持一個返回SQL的方法。 LINQ可能是一個選項等

回答

2

爲什麼不使用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); 

如果你想不允許用戶把任何一種類型的INT通用參數,你可以有你的模型都繼承一個基類或一個接口,然後將查找方法更改爲:

public T Find<T>(Expression<Func<T,object>> expression) where T : IMyModelInterface //or whatever base class you want 
+0

謝謝Jose。我以前沒有用過LINQ。如果我使用LINQ Expression作爲Find函數的參數,那麼現在我的問題將被轉換爲如何將該表達式轉換爲Web Service方法所需的參數?表達式肯定會有助於我的內存緩存/數據收集,但我的主要問題是關於調用Web服務場景。 – byte 2010-07-16 13:36:52

+0

我認爲最簡單的方法就是讓webservice以表達式樹的形式作爲參數,在web服務中實現一個IQueryable(即Linq To SQL),然後在Web服務中向其提供表達式,然後不要不必進行任何分析,只需傳遞一下信息即可。 :) – Jose 2010-07-16 13:59:35

+0

謝謝。問題是我無法修改Web服務。它也可能不是.NET Web服務(可能是unix上的Java或C++)。 所以WebMethod將是類似於 字符串FindMembers(字符串姓氏,int minAge,字符串城市) 其中返回類型是XML作爲字符串 – byte 2010-07-16 14:27:40