次のセットアップのベストプラクティスを探しています。
View は、(WPF を介して) ViewModel にバインドされたデータです。ViewModel は、INotifyPropertyChanged を介してビューを更新します。モデルは、イベントを介して ViewModel を更新します。モデルは、WebClient を介してインターネットからデータを取得する方法や、データベースからデータを取得する方法など、外界からのものについて知っています。
UI (ひいてはユーザー) が外の世界での待機に悩まされないようにするために、外の世界へのものの取得と送信は非同期で行う必要があります。
これを行うためのベストプラクティスの方法は何ですか?
1. ViewModel は、モデル メソッドの非同期呼び出しを担当する必要があります。
これには、次のようなものを書くことができるという利点があります
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
Url = result.Url;
}
Url
ビューを更新する INotifyPropertyChanged を持つ ViewModel プロパティです。あるいは
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
_view.Url = result.Url;
}
ここで、INotifyPropertyChanged をまとめて回避できます。これらの方法のどれを好みますか?
ただし、モデル自体に非同期処理を実行させる方が賢明な場合があります。View と ViewModel を使用せずに Model を使用できるようにしたい一方で、非同期で動作させたい場合があります。別の議論は、どのようなものを非同期で処理するのが最適かをモデルがよく知っているということです。
2.モデルはすべての非同期処理を単独で処理します。ViewModel コードは次のようになります
GetWebPage(string url) {
Model.GetWebPage(url);
}
そしてモデルで
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
if (UrlChanged != null);
UrlChanged(this, new UrlChangedEventArgs(url));
}
ViewModel がサブスクライブできることを確認し、それに応じて View を更新します。
どの方法がベストプラクティスだと思いますか?