6

次のセットアップのベストプラクティスを探しています。

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 を更新します。

どの方法がベストプラクティスだと思いますか?

4

2 に答える 2

3

3 番目の方法: ビュー モデルは非同期呼び出しを行いますが、クライアント側のサービスを使用して Web ページを取得します。モデル自体は貧血です (外界について何も知りません)。

GetWebPage(string url) 
{
  var dataService = anyServiceLocator.GetService<IDataService>();
  var result = await dataService.GetWebPageAsync(url, Model);
  Url = result.Url;
}

これにより、たとえばテスト目的で、実際のデータ ダウンロード アルゴリズムを変更できます。

于 2012-10-29T10:32:49.230 に答える
0

説明されているシナリオのベスト プラクティスは、すべてのアプローチの長所と短所を考慮して、あなたが思いつくものであり、それはあなたのタスクに固有のものになると思います (要件はタスクごとに変化するため)。質問に対する実際の回答に関しては、大きな違いはないと思います。私は今別のアプローチを考えていますが。パラメーターとして VM に渡すことができるヘルパー (おそらく DownloadManager) オブジェクトの非同期動作をパラメーター化することを考えてみてください。これにより、動作を区別せずに VM とモデルの両方を簡単にテストし、その動作を DownloadManager で個別にテストできます。

于 2013-02-22T10:47:02.440 に答える