2011-11-13 7 views
2

私はPrismデスクトップアプリケーションで作業しており、WCFバックエンドを使用しているときにルックアップ/参照データリストを処理する最善の方法を知りたいと考えています。私はこの質問がいくつかの分野を網羅していると思いますが、私はいくつかのガイダンスを参考にしたいと思います。MVVMでWCFサービスを呼び出しますか?

たとえば、システムのさまざまな入力画面で使用される製品(コードと説明)を含むルックアップを考えてみましょう。

  1. viewmodelは、コントロールを満たすためにデータを取得するために直接WCFサービスを呼び出しますか?
  2. 独自のviewmodelなどで商品を扱うだけのコントロールを作成し、それを製品ルックアップを必要とするすべての場所で使用するか、単一のフォームビューモデルごとに商品ItemsSourceを再投入するコンボボックスを再実装しますかそれはそれを使用しますか?
  3. LookupDataサービスのような新しいWCFサービスを作成し、それを使用してルックアップリストを作成することはできますか? - 私はこれを行うと私は多くのルックアップで終わるだろうと心配しています。
  4. これについては他にどのような方法がありますか?

答えて

2

WCFサービス用にproxyオブジェクトとしてルックアップオブジェクト/コンポーネントを作成することをお勧めします。これは、いくつかの方法で作業することができますが、最も簡単な私の心に来るには、次のようになります。

  1. すべてProductsエンティティを提供する方法でWCFサービスを実装し、1(製品コードに例えば基点。)
  2. 実装を要求しましたProductsProvider
  3. あなたのビューモデルが(例えば。constructor injection経由)ProductsProviderへの依存を取るのはそれを呼び出すせ、製品を取得するために、WCFクライアントを使用するコンポーネント

このモデルのキー要素はProductsProviderです。Productsオブジェクトのキャッシュの一種として機能します。まず、すべての製品(またはその一部、好みに応じて)をWebサービスに要求します。その後、製品を検索する必要があるときはいつでも、プロバイダに質問してください。がどのように製品がどのように扱われるべきかを扱う責任はです。おそらくそれは既にローカルリストに入っていますか?おそらく、更新のためにWebサービスを呼び出す必要がありますか?例:

public class ProductsProvider 
{ 
    private IList<Product> products; 
    private IProductsService serviceClient; 

    public ProductsProvider(IProductsService serviceClient) 
    { 
     this.serviceClient = serviceClient; 
     this.products = serviceClient.GetAllProducts(); 
    } 

    public Product LookUpProduct(string code) 
    { 
     // 1: check if our local list contains product with given code 
     // 2: if it does not, call this.serviceClient.LookUpProduct 
     // 3: if service also doesn't know such product: 
     // throw, return null, report error 
    } 
} 

、何これはあなたに与えられることである。

  • あなたが唯一の方法やサービスがご
  • と呼ばれていると ProductsProviderインスタンス
  • 優れた柔軟性を持っている必要がありますビューモデルはWCFをまったく処理する必要はありません

編集:

あなたの2番目の質問は。コントロールは必要ないかもしれませんが、Productエンティティのビューモデルは間違いなく良いアイデアです。

関連する問題