2010-12-28 8 views
2

私はMVVMパターンを使用してクライアント/サーバー(WPF/WCF)アプリケーションで作業しています。サービス経由で保存する場合、モデルの一貫性を保つにはどうすればいいですか?

ViewModelのプロパティはモデルのプロパティにバインドされ、モデルが変更されたときに変更がすぐにビューに反映されます。

ユーザーがリフレッシュをクリックすると、サーバー上の新しい/変更されたデータがモデルにマージされるため、リフレッシュの仕組みがうまく機能します。

ユーザーの編集および保存のプロパティを処理するにはどうすればよいですか?

  • ユーザーが
  • の変更が成功した場合は、サーバー
  • に送信され、「保存」
  • ユーザーがクリックしたテキストボックスの値を変更し

    1. ユーザーがクリックし、「編集」:ここで私は起こるしたいものですサーバーは更新されたアイテムを返し、これは モデルにマージされ、UIが更新されます。
    2. 成功しないと、サーバーはエラーを返し、モデルは更新されません。

    はMVVMを使用して、モデルは(ステップ5 & 6冗長を行う)ステップ3で更新され、エラーがサーバー上で発生した場合、クライアントのデータがサーバと矛盾になると思われます。

    この状況に対処するベストプラクティス方法はありますか?

  • +1

    シナリオでは、サーバー上のデータがクライアントが何もしなくても、特定のクライアントと同期を失う可能性はありますか?将来これが可能になるのだろうか?私が尋ねる理由は、ユーザーがアプリを再起動したり手動で更新したりする必要のない同期化戦略が必要な場合があるということです。このような問題は、その戦略にうまく収まるかもしれません。すべての保存の後に、単純に同期をとることもできます。 –

    +0

    はい - マルチユーザーアプリケーションですが、クライアントが最新の状態になるようにアイテムを表示するたびに最新表示が行われます。あなたが示唆しているのは理にかなっていますが、ユーザーが[保存]をクリックしたときにサーバーがダウンしている場合はどうなりますか?元の値を元に戻したい(おそらくオフラインモードに移行する)。 –

    +0

    問題の一部は、Webサービス*がモデルであることです。リモートコピーとローカルコピーは、どちらも同じものの表現です。モデルをリモートで更新できない場合は、モデルをローカルで更新して、同期外れに対処するために必要な作業をすべて行う必要があります。 msgstr "ユーザがアイテムを閲覧するたびにリフレッシュが発生します" msgid。見ている間に更新されるとどうなりますか?このようなケースを処理する方法を理解しておかなければなりません。単に、ダイアログが開いてしまったために、誤って別のユーザーの変更を元に戻さないようにする必要があります。 –

    答えて

    0

    解決策は、第2セットのオブジェクト(ModelUpdates)を作成することです。

    をクリックすると、(Modelオブジェクトと同じプロパティを持つ)ModelUpdateオブジェクトがインスタンス化され、DataContextがそのオブジェクトに切り替わります。

    を保存すると、ModelUpdateオブジェクトの詳細がサービスに送信されます。サービスは、更新されたオブジェクトに関する詳細を応答し、モデル・リポジトリにマージされます。

    これは、モデルが正常に保存されたデータでのみ更新されることを意味します。オブジェクトが正しく保存されなかった場合は、データベースのバージョンがクライアントに返されます。保存時にエラーが発生した場合は、データベースのバージョンがクライアントに返されます。サーバーが使用できない場合、クライアントはプレ編集バージョンを保持します。

    -1

    私は同期ポスト方法を使うべきだと思います。
    このようにして、エラーが発生した場合、モデルとビューの面は同じになります。また、保存されたデータを取得するまで、ビューは更新されません。

    簡単な言葉では:

    1)ユーザーが編集
    2をクリックした)ユーザーが変更
    3)ユーザーがクリックする
    3.1を保存する)アプリケーションは、モデル
    3.2にデータをsumbitsます)モデルは、変更を保存します
    3.3)モデルは変更されたデータを返します
    4)変更(変更されたデータ)または失敗したメッセージで変更を表示します。

    +0

    ありがとう@エリックしかし、あなたの解決策は、私が避けようとしている問題が残っています - 保存が失敗した場合、データ。 –

    0

    これを処理した方法で元のデータのコピーが保存されました。 更新が失敗すると、元のデータがビューに復元されました。

    +0

    これは、プログラマーがエラー処理において常にそれを説明する場合に有効です。私は、個々のプログラマーからの責任を取り除くアーキテクチャ上の解決策を探しています。 –

    関連する問題