2009-07-21 7 views
0

MVVMパターンとPrismフレームワークを使用してアプリケーション(SilverlightとWPF)を作成しています。私のアプリケーションでは、顧客リストを含むグリッドがあります。その下で、私は顧客の詳細を提示する様々な意見を持っています。すべての情報は、クエリーからのデータと、データが受信されたときにイベントを発生させるコールバックを提供するWCFサービスから供給されます。詳細情報は、グリッド内の選択された項目が変更されたときに更新されます。詳細情報の日付範囲を制御するフィルタリングビューもあります。MVVM、Prism and Service Discovery

同様のビューのセットを実装する必要がありますが、特定の顧客向けです。表示される情報は同じですので、明らかに同じビュークラスとモデルクラスを再利用することをお勧めします。

最初の考えは、両方のシナリオでモデルとWCFサービスの間にある別の中間サービスを構築することでした。インスタンスを名前で登録することによって、モデルを特定のサービスにバインドします。

残念ながら、これは、私が好む依存性注入に頼る代わりに、自分で多くのクラスをインスタンス化しなければならないことを意味します。

MVVMのすべての専門家にとって、Prismフレームワークの機能を最大限に活用し、コードの再利用を促進するために、ビュー、モデル、サービスをどのように構成する必要がありますか?

多くの感謝!

====編集:ここでは====以下のテキストと例を追加しました

は私が達成しようとしているかを説明願っています簡単な例です。

public class CustomerViewModel : ICustomerViewModel 
{ 
    public ICustomerView View { get; private set; } 
    private readonly ICustomerService customerService { get; set; } 
    private Customer customer; 

    public CustomerViewModel(ICustomerView view, ICustomerService service, IEventAggregator eventAggregator) 
    { 
     customerService = service; 

     eventAggregator.GetEvent<SelectedCustomerChangedEvent>().Subscribe(CustomerChanged); 
     eventAggregator.GetEvent<CustomerInfoUpdatedEvent>().Subscribe(CustomerUpdated); 

     View = view; 
     View.Model = this; 
    } 

    public string Name 
    { 
     get 
     { 
      return customer.Name; 
     } 
    } 

    public string Email 
    { 
     get 
     { 
      return customer.Email; 
     } 
    } 

    public void CustomerChanged(int customerId) 
    { 
     customerService.RequestCustomerInfo(customerId); 
    } 

    public void CustomerUpdated(Customer customer) 
    { 
     this.customer = customer; 
    } 
} 

この顧客ビューモデルは、顧客がグリッド内にある現在のデザインに基づいています。顧客を選択するとSelectedCustomerChangedEventが発生し、ビューモデルが情報を要求します。

コールバックメカニズムを使用してデータを提供する基になるWCFサービスから供給されます(データの取得/計算に時間がかかるため、単純なWCF呼び出しは機能しません)。これはうまく動作します。問題は、現在選択されている顧客ではなく特定の顧客に関する情報を表示するアプリケーションの別の領域で、この同じビューとモデルを再利用することです。

私の最初の考えは、顧客固有のビューが開かれたときに、リストのSelectedCustomerChangedEventと同様のイベントを処理する中間サービスを作成することでした。その後、同じCustomerInfoUpdatedEventを介してモデルにデータを提供します。

問題は、同じインターフェイスを実装する2つのサービスがあるため、それらの名前を付けて、ビューモデルに何らかの形でコンテナから取得する必要があるかどうかを知る必要があるということです。

私はおそらく設計上の誤りがあることを知っています。良いニュースは、私はそれを修正する時間があることですが、私はそれを修正する方法がわかりません。

+0

私はあなたがしようとしていることを正確に追跡するのが難しいと感じています。あなたはいくつかの "ダムダウン"の例を投稿できますか? –

答えて

0

Customerクラスがすべての顧客(特定の顧客を含む)で同じ場合は、単一のサービス、同じビュー、および同じモデルを使用します。

なぜこれが機能しないのか教えていただけますか?

+0

はい、すべての顧客でCustomerクラスが同じです。問題は、現在のビューモデルでは、顧客情報を更新する必要があるが、顧客リストの一部として使用されるビューモデルにのみ適用する必要があることを通知するイベントが使用されることです。 –

0

うーん...ここにはたくさんの情報がありますが、私はこれを刺すでしょう。

実際にこれを複雑にする理由はありません。あなたのWCFサービスからコールバックイベントを受け取っているように感じます...そうですか?その場合、着信WCFコールバックがユーザーが表示している顧客に関係する場合は、UIを更新する必要があります。私はこれらの前提から作業します...私が誤解すれば私に知らせてください。

私はあなたが必要とするものをほとんど持っていると思います。あなたのWCFコールバックハンドラから

  1. 、EventAggregatorは、顧客IDとともに、新たな顧客情報を渡すとイベントを発生させる:私はあなたがする必要があるすべては次のようだと思います。
  2. ViewModelのコンストラクターでCustomerUpdatedイベントを購読し、ビューモデルで見ているカスタマーIDのフィルターを追加します。あなたはこれを見逃していますが、それは重要です。そうしないと、インスタンス化されたViewModelには関係しないイベントのFirehoseが発生します。このクイックスタートには、このテクニックのサンプルがあります。http://msdn.microsoft.com/en-us/library/dd458918.aspx

また、これは達成しようとしていることを理解するのに最適です。そうでない場合はお知らせください。