1

Service Locatorクラスを使用して、バインドするWPFページのViewModelを提供する場合。ViewModelsはシングルトンスコープまたはファクトリスコープのどちらにする必要がありますか?一般的に、WPFアプリケーションの方が良いアイデアはありますか?

Silverlightでは、シングルトンはユーザーコントロールであり、フォアグラウンドに出入りするだけのページに適していることを認識しています。しかし、このパターンを適用しようとするまで、ロードされるたびにページのインスタンスとそれぞれのVMを更新してきました。

私と私の同僚は、各オプションのすべての長所と短所を経験しましたが、私たちのシナリオにとってより良いオプションである叫び声は何もありません。

ありがとう。

4

2 に答える 2

2

ビューモデルのシングルトンを作成することは避けたいと思います。ユーザー セッション全体のリージョンに永続化されるビューでない限り。ナビゲーションやメニューなどのようなもの。Prism/Composite WPF を使用する場合、Unity を IoC または Service Locator として活用します (そのように使用する場合)。View Models/Presentation Models は、提示時に作成され、ガベージ コレクションのために残されます。閉じたとき。これにより、各画面が意図したとおりにライフサイクルをたどることができます。

RegionManager (CompositeWPF) などを使用して、ビュー モデルが明示的に閉じられるまでメモリ内に保持できます。これにより、ユーザーは、必要に応じて対話を維持しながら、開いているビューをタブで移動できます。ユーザーが画面を保存/閉じることを決定すると、RegionManager から削除され、ガベージ コレクションが行われます。

シングルトンは、非常に特定の目的のために使用される設計パターンです。つまり、必要なのは 1 つだけで、アプリケーションの存続期間中は 1 つしか必要ありません。それが要件でない場合、私は近づかないでしょう。

于 2009-08-22T01:26:57.810 に答える
0

ビューモデルが何をしているのかを考えるために一歩下がると、モデルを割り当ててから、ビューにコマンドまたはバインドプロパティを使用させます。

したがって、すぐに、各ViewModelはモデルに固有のインスタンスになります。

また、ViewModelメソッドは通常、現在のモデルインスタンスで機能します。つまり、メソッドは分離された論理ユニットではありません。すなわち

interface IService
{
    Foo Model;
    Result DoSomethingWithModel();
}

独自のインスタンス状態に依存するロジックがあります。

これは純粋な論理サービスですが、

interface IService
{
    Result DoSomething(With me);
}

私の意見では、リクエストが1つしかない場合でも、リクエストごとに新しいViewModelインスタンスを挿入することをお勧めします。

于 2013-02-27T15:18:01.617 に答える