2009-08-21 8 views
1

サービスロケータクラスを使用して、WPFページをバインドするViewModelを提供する場合。 ViewModelをSingletonスコープまたはFactoryスコープにする必要がありますか?一般的にWPFアプリケーションのためのより良いアイデアですか?WPFアプリケーションでサービスロケータパターンを使用する場合のビューモデルの範囲

Silverlightでは、ユーザーコントロールであり、フォアグラウンドの内外に移動されるだけのページにシングルトンが適していることを知っています。しかし、このパターンを適用しようとするまでは、ロードするたびにページのインスタンスとそれぞれのVMを新しくしています。

私と私の同僚は、それぞれのオプションのすべてのプラスとマイナスを経験しており、私たちのシナリオのためのより良い選択肢は何もないと叫んでいません。

ありがとうございました。

答えて

2

私は、あなたのView Modelシングルトンを作ることから遠ざかります。ユーザーセッション全体でリージョンに保持されているビューでない限り、ナビゲーションやメニューなどのようなものPrism/Composite WPFを使用する場合は、IoCやサービスロケータとしてUnityを活用していれば、表示モデル/プレゼンテーションモデルは作成時に作成され、ガベージコレクションのために残ります閉じたとき。これにより、各画面のライフサイクルが意図どおりに進むようになります。

RegionManager(CompositeWPF)のようなものを使用して、明示的に閉じられるまでView Modelをメモリに保持することができます。これにより、ユーザーは、必要な場合に相互作用を維持しながら、開いているビューをタブすることができます。ユーザーが画面を保存/閉じることを決定すると、画面はRegionManagerから削除され、ガベージコレクションされます。

シングルトンは非常に特殊な目的のために使用されるデザインパターンです。つまり、1つだけ必要であり、アプリケーションの存続期間中に必要なものです。それが要件でないなら、私は離れています。

0

もし私がビューモデルが何をしているのか考えようと思えば、私はそれにモデルを割り当て、次に私のビューにコマンドやバインドプロパティを使用させます。

すぐに、各ViewModelはモデル固有のインスタンスです。

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

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

は、独自のインスタンス状態に依存するロジックを持ちます。

これは純粋な論理的なサービスであるのに対し:

​​

良いコードの練習、私の意見では、あなただけの今までに1つの要求があっても、リクエストごとに新しいViewModelにインスタンスを注入することであろう。

+0

下の投票を説明する気に?私は受け入れられた答えと同じ結論になるので、ここで:http://stackoverflow.com/questions/6188584/viewmodel-and-singleton-pattern –

関連する問題