2

私は現在、WPFアプリケーションを開発するために.NETPrismフレームワークを使い始めています。私が判断できないことの1つは、WCFサービスまたはデータベースへの非同期呼び出しを実現するための最良の方法ですか?その理由は、WCF / DB呼び出しでUIスレッドをブロックしたくないためです。これにより、操作が完了するまでUIがフリーズします。

私の理解から、私はアーキテクチャに従う必要があります:

View (WPF) <=> View Model <=> Application Services <=> DB/WCF

AsyncDelegateCommandのようなものを使用して、ビューモデルに非同期動作を実装しますか?これを行うと、UIスレッドで状態を設定する必要があるため、アプリケーションサービスで状態を維持できなくなります(これを回避する方法がない限り)。

したがって、もう1つのオプションは、アプリケーションサービスでコールバックを使用して非同期メソッドを提供し、アプリケーションサービスに非同期操作のスレッド/タスクを生成させることです。

Prism StockTraderリファレンス実装を簡単に調べましたが、非同期では何も実行されていないようです。これは非常に一般的な問題であると思います。これに対処するには、いくつかのベストプラクティスが必要です。

4

1 に答える 1

3

「ベストプラクティス」に関して、オンラインで何も見つかりませんでした。

個人的には、次の設定が適切だと思います。View <= BINDING => ViewModel <==> DataRepository/DataAccessLayer (Async Calls)

ViewModelをDALと同期させる限り、同期する必要のあるデータに応じて、いくつかのことを実行できます。

  • モデルのコレクションのを公開ReadOnlyObservableCollection<T>し、それらのバッキングコレクションを内部で(DAL内から)管理します。
  • 単一アイテムの場合、アイテムの新しいインスタンスを返し、非同期完了イベントにアイテムをロードします。
  • また、EventAggregatorを愛することを学びます(それほど複雑ではありませんが、オンラインでは改善されています--EventAggregator Extension)。それは大いに役立ちます。これを使用して、「作業中」および「完了」イベントをアナウンスすることをお勧めします。

基本的に、Service Reference Generatorは非同期呼び出しの構築に役立つため、それを操作し、DataRepository / DALを使用してデータを管理し、ViewModelsおよびEventAggregatorへの参照を内部的に公開してWorking/Completedをアナウンスします。


また、これを言う必要があります... DALを完全に同期させ、ViewModelでDALとの間ですべての非同期呼び出しを行うことを選択できます。これは、ビューを許可するために、ある種の「IsWorking/Completed」プロパティを公開する必要があるためです。何かが起こっているか、それが行われたことを知っています。重要なのは、すべての非同期性を1つのレイヤー(ただし、ビューではない)に確実に固定することだと思います。ViewModelレイヤーでこれを行うと、非同期呼び出しを構築するためのコーディング作業が増えますが、はるかにクリーンになります。あなたはDALが同期的に物事を行うだけであり、完了した/動作中のイベントを公開する必要はありません。実際、これがより一般的なアプローチだと思います。

于 2011-07-05T12:58:59.900 に答える