7

サーバー側にステートレス サービスと貧血ドメイン オブジェクトがあります。サーバーとクライアント間のモデルは POCO DTO です。クライアントは MVVM になる必要があります。モデルは、20 の異なるクラスの約 100 のインスタンスのグラフである可能性があります。クライアント エディターには、モデル/ビューモデルにライブ接続されたさまざまなタブ ページが含まれています。

私の問題は、サーバーのラウンドトリップ後に変更を適切に伝達する方法です。ViewModel から DTO に変更を反映するのは非常に簡単です。古い DTO を破棄して新しいものに置き換えることはできますが、リスト/DataTemplates の再描画が大量に発生します。

サーバー側の変更を収集し、クライアント側に送信できました。ただし、変更されたフィールドの名前は、ViewModel 固有ではなく、ドメイン/DTO 固有のものになります。そして、マッピングは私には自明ではないようです。ラウンドトリップ後に必須の方法で行う必要がある場合、ビューモデルの SOC/モジュール性が損なわれます。

オートマッパーやエミットマッパーなど、ある種のマッピングルールエンジンについて考えています。しかし、それは非常に単純なユースケースを解決します. アイテムをリストまたは削除に追加することをマップ/伝播/変換する方法がわかりません。値を既存のインスタンスにマージできるように、コレクション内のインスタンスを識別する方法。同様に、検証/エラー情報を伝達する必要があります。

たぶん、DTO に INotifyPropertyChanged を実装し、サーバー側のイベントを再生しようとする必要がありますか? そしてViewModelをそれにバインドしますか?バインディングは、コレクションのマージに関する問題を適切に解決しますか? そのために PRISM の EventAgregator は役に立ちますか? イベントの記録再生コンポーネントはありますか?

サーバー側のロジックを備えたアーキテクチャのためのより良いクライアント側のパターンはありますか?

4

2 に答える 2

1

通常、Model クラスで DTO への参照を保持しています。複数のモデルの場合、各モデルが DTO から自身を構築する方法と、注入可能な「セーバー」または他のサービス プロバイダー オブジェクトを使用して自分自身を保存する方法を認識していることを確認します。DTO への参照を持ち歩くと、モデルで Save() を呼び出すときに、サービスに戻す前にモデルに従って古い DTO を変更することが非常に簡単になります。

Save() 操作後の他のオブジェクトへの「更新」は、他の DTO で伝達され、ViewModel で使用される適切なモデル クラスにロードされることを願っています。

これの欠点は、実際にはマッピング コードを記述する必要があることですが、通常はこれが最も簡単な部分です。これが最善の方法であるとは確信していません。他の人の回答を読んでいただければ幸いです。

于 2010-08-31T11:18:35.863 に答える
0

私は多くの成功を収めた別のバリエーションを使用しました。リアルタイム GUI を使用していたため、クライアントでの再描画の繰り返しは許容されませんでした。

プロパティの変更を DTO に認識させPropertyChanged、ViewModel にイベントを発行することで、サーバー側のイベントを再生します。

コードは簡単に記述でき、単体テストなども簡単PropertyChangeListenersです。(ViewModel によって実装されたインターフェイス) を入力すると、参照が容易になります。

この境界は、スレッドを GUI ワーカー スレッドに切り替えるためにも使用できます。

于 2010-08-31T14:35:38.917 に答える