2011-02-06 15 views
1

RIAドメインコンテキストを自分のビューモデルから抽象化してデータソースに依存しないようにするためのベストプラクティスを探しています。私が見つけることができる最善の解決策は、hereと記載されているサービスエージェントのパターンのようです。しかし、比較的複雑なクエリロジックを実行するとどうなりますか?WCF RIA複雑なクエリを使用したService Agentパターン

たとえば、現在のビューモデルではドメインコンテキストがあります。のは、私は、検索クエリの構築に関与した論理のビットがある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でクエリを構築することができる、より良い選択肢がありますか?または私はそれを吸うといくつかのパラメータオブジェクトを使用する必要がありますか?

私は現在VMの小さな階層を持っているので、基本検索クラスとテンプレートメソッドを使用してさまざまな検索を実行するため、VMのクエリを構築することができます。

enter image description here

は、私は、この継承構造を使用して固定コードの重複の多くを引き起こすクライアントからのクエリを生成することができません。

+0

私はこのような質問をして2時間以内に1トンの回答が得られると思います。今や人々は簡単な質問に答えるだけである。 StackOverflowは実際に下り坂になりました。 –

+0

私は最近同じ質問から考えてきました。 VMデータソースを無関係にすることにはあまり関心がありません(表示されるよりもはるかに難しいですが)、私は確かにDomainContextから切り離したいと思います。私は良いアプローチは、EntityQueryを返したサービスレイヤーに 'GetContactsQuery'メソッドを追加し、EntityQueryをとる 'LoadContacts'メソッドを追加することだと考えていました。より良いアプローチは、サービスエージェントでクエリを「再生する」クエリタイプを作成することです。これらのアプローチのどちらかが妥当と思われますか? –

答えて

1

私はリポジトリのパターンを調べることをお勧めします。これはDDDの一部ですが、どのアーキテクチャにも対応しています(IMO)。クエリロジックを格納するのが目的です。

single purposeでない限り、VMオブジェクトのクエリロジックを提供するのが汚いようです。

+0

ありがとう。私は、リポジトリとサービスエージェントの間に多少のハイブリッドを使用してしまいました。私がVMの唯一の目的はクエリです - 彼らは検索ビューのビューモデルです。彼らが行うことは、検索用語(ビュー状態)を収集し、それらをクエリ(ビュー動作)に使用することだけです。 –