MVVMアプローチは素晴らしく、十分に確立されています。ただし、シーンを想像してみてください。ユーザーが実行時間の長いタスクを開始できるアプリページがあります。ローカルデータベースとリモートデータベースの同期のように。このタスクは長くなる可能性があるため、適切に中断する必要があります。次に、ユーザーは詳細ページに移動してページを離れます。アプリはまだ実行中であるため、その長い非同期操作をキャンセルすることは意味がありません。しかし、突然ユーザーが電話を受けたため、アプリが非アクティブ化されました。
MVVMの私の(おそらくあまりにも原始的な)理解では、モデルとの相互作用(特にその長い操作)を制御するためにビューモデルを使用する必要があります。ただし、ビューモデルは、コードの再利用性を制限するため、アプリケーションの有効期間イベントについて知る必要はありません(Windows 8には、PhoneApplicationServiceなどのクラスはありません)。ここに矛盾がありますか?VMは操作を開始しますが、キャンセルには使用しないでください。
もちろん、Viewは生涯イベントを処理するためにこの責任を負うことができます。そのため、アプリの非アクティブ化に関するイベントは次のように伝播しますView -> ViewModel -> (cancels long operation) -> Model
。ただし、ユーザーがビューから移動し、そのビューで開始された操作の一部がまだ実行されている場合、それをキャンセルする方法はありません。ビューはいつでも破棄できます。
ビューモデルでアプリのライフタイムイベントを処理するというアイデアを思いついたのは1つだけです。ただし、前に述べたように、ビューモデルの移植性が制限されるため、このアプローチは嫌いです。誰かがより良い解決策を提供できますか?