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つのサービスがあるため、それらの名前を付けて、ビューモデルに何らかの形でコンテナから取得する必要があるかどうかを知る必要があるということです。
私はおそらく設計上の誤りがあることを知っています。良いニュースは、私はそれを修正する時間があることですが、私はそれを修正する方法がわかりません。
私はあなたがしようとしていることを正確に追跡するのが難しいと感じています。あなたはいくつかの "ダムダウン"の例を投稿できますか? –