私は、C# と WPF を使用して構築されたアプリケーションに取り組んでいます。これは (ひどく) MVVM を実装しています。仕事の内訳は次のようなものです。
意見
- プレゼンテーション、ビットマップ、色など
- アニメーション(使用する場合)
- ViewModel にデータ バインドすることで、ViewModel と通信します。
- コマンドを発生させることにより、ViewModel と通信します。
ビューモデル
- ビューによって呼び出されるコマンドを公開します
- データ処理機能をモデルに委任します
- UI の動作を定義します
- ビューへの直接的な (名前付きの) 依存関係はありません
- モデル内のメソッドを呼び出してモデルと通信します
- モデルによって公開されたイベントをサブスクライブすることにより、モデルの変更が通知される場合があります
モデル
- ディスクの永続性、データ分析など
- ほかのすべて
- ViewModel に依存しない
残念ながら、これにより循環参照が発生しました。ビューは、イベントを発生させてコマンドを起動するためにビューモデルへの参照が必要であり、ビューモデルはビューステートを更新するためにビューへの参照を必要とするためです (通常、この参照は WPF のビューモデルによるものDataContext
です)。作業を委任するためのモデルへの参照、およびモデルは多くの場合、状態の外部変化をビューモデルに通知する必要があります。
したがって、ビューモデルが真ん中にあるという 2 つの循環参照の問題があります。その結果、WPF エンティティが作成され、モデル内の一部のデータに関連付けられており、これらのエンティティは (プログラムが終了するまで) クリーンアップされないため、このアプリケーションではメモリ消費の問題が発生しています。
これはどのように扱われるべきですか?
所有権グラフを定義する必要があるようです。これらのコンポーネントの 1 つまたは複数が、関連性がなくなったときにイベント ハンドラーを切断する責任を負い、物事を GC できるようにします。