2011-02-06 64 views
1

我正在尋找有關從我的視圖模型抽象我的RIA域上下文,使他們的數據源不可知的最佳做法。看起來我能找到的最佳解決方案是here所述的服務代理模式。但是,如果我有一些相對複雜的查詢邏輯來執行呢?WCF RIA服務代理模式與複雜的查詢

例如,目前我在我的視圖模型中有我的域上下文。比方說,我有一個ContactSearchViewModel,那裏是參與構建搜索查詢了一下邏輯:

protected EntityQuery<Contact> CreateSearchQuery() 
    { 
     var query = Context.GetContactsQuery().Where(
         e => e.First_Name.ToLower().StartsWith(FirstNameSearch.ToLower()) && 
         e.Last_Name.ToLower().StartsWith(LastNameSearch.ToLower())); 
     if (!string.IsNullOrEmpty(Phone)) 
     { 
      query = query.Where(q => q.Phone == Phone || 
            q.Mobile == Phone || 
            q.Work == Phone); 
     } 
     if (SelectedContactType == "Prospect") 
     { 
      query = query.Where(q => q.Contact_Type_Id == 1); 
     } 
     else if (SelectedContactType == "Customer") 
     { 
      query = query.Where(q => q.Contact_Type_Id == 2); 
     } 
     return query; 
    } 

現在我當然也有一個簽名服務代理方法,看起來像public EntityList<Contact> SearchContacts(string firstName, string lastName, string phone, ContactType contactType)但想象一下,如果我搜索查詢更加複雜 - 這個界面將變得笨拙。有沒有更好的選擇,我可以像在域上下文中一樣在VM中構建查詢?或者我應該吸收它並使用一些參數對象?

我非常希望能夠在虛擬機上構建查詢,因爲我目前有一小部分虛擬機,它們都使用基本搜索類和用於生成查詢的模板方法執行各種搜索,類似於

enter image description here

不能夠產生來自客戶端的查詢會導致大量重複的代碼,我用這個繼承結構固定。

+0

我記得有一段時間我會在幾個小時內得到大量答案,提出這樣的問題。現在人們只會回答簡單的問題。 StackOverflow真的走下坡路了。 – 2011-02-07 21:26:05

+0

我最近一直在思考同樣的問題。我對使VM數據源不可知(真的比看起來難得多)感興趣,但我肯定想要從DomainContext中分離出一些東西。我在想一個好方法可能是向返回EntityQuery的服務層添加一個'GetContactsQuery'方法,然後添加一個接受EntityQuery的'LoadContacts'方法。更好的方法可能是創建一個查詢類型來在服務代理中「重放」查詢。這兩種方法中的哪一種看起來都合理? – 2011-02-15 00:59:11

回答

1

我會建議尋找存儲庫模式。它是DDD的一部分,但適用於任何架構,IMO。它的目的是容納查詢邏輯。

給你的虛擬機對象查詢邏輯似乎很骯髒,除非這是他們的single purpose