私のWPFアプリケーションでは、MVVMパターンを依存性インジェクションとともに使用します。依存関係インジェクションを使用したMVVM ViewModelsの古いデータ
データベースからデータを準備するViewModelsは、コンストラクタに注入されたリポジトリを取得します。また、コンストラクタ内のリポジトリからのデータをプロパティに取り込みます。
ViewModelはすべて、ViewModelLocatorクラスの静的コンストラクターで作成され、すべてのビューがViewModelにバインドするために使用されます。
これは、次のような欠点がありますViewModelにインスタンスが常に同じであるため、ビューで
- データは、それらを閉じて再開いていない場合でも、更新されることはありません。
- 最初のビューを開くと、すべてのViewModelがインスタンス化され、必要なデータがデータベースからロードされます。私はこれらの問題を解決するには、2つの方法を考えることができ
: - ではなく、コンストラクタでそうするの
- は、すべてのViewModelには、データベースからデータを読み込み、プロパティを初期化するメソッドを実装してください。これは、ビューが開かれるたびにそのメソッドを呼び出す必要があります。これは私が好きではないtemporal couplingを紹介します。
- ViewModelLocatorの対応するプロパティが呼び出されるたびに、要求されたViewModelを作成するように、ViewModelLocatorを実装します。私はこの方法が嫌いです。なぜなら、私のコンポジションルートはプログラムの開始時には実行されず、プログラムインスタンスのライフタイム全体に広がるからです。
この問題を解決する別の方法はありますか?どのように他の人はこれを解決していますか?
あなたの答えをありがとう。私のViewModelごとに工場を持つことは、工場が1か所でしか使用されず、現時点では必要ではないため、少し残忍なようです。さらに、彼らは 'container.Resolve'よりも何もしません。 ViewModelLocatorはコンテナが使用される唯一の場所であるため、抽象ファクトリを介して 'container.Resolve'を呼び出すことをお勧めします。この場合でもコンテナはアプリケーションコードに漏れないためです。私が考えることができる抽象的な工場の唯一の利点は、コンテナの構成が正しくない場合、起動時にすぐにエラーが発生することです(続き)。 –
(続き)。 –