0

1 つのウィンドウで編集し、同時に別のウィンドウで使用できる一連のドメイン オブジェクトがあります。オブジェクトが常に有効な状態にあり、コミットされるまで変更が外部に表示されないようにするため。オブジェクトはリポジトリに保存されます (各オブジェクトには一意の ID があります)。

  1. ユーザーが「実行」ウィンドウを開く (オブジェクト A への読み取り専用アクセス)
  2. ユーザーが「編集」ウィンドウを開く (オブジェクト A への読み取り/書き込みアクセス)
  3. ユーザーは UI で一部のプロパティを変更しますが、[適用] をクリックしません
  4. ユーザーは実行ウィンドウの「実行」ボタンをクリックします。実行操作は「古い」設定で実行する必要があります。
  5. ユーザーは、編集ウィンドウで「適用」ボタンをクリックし、実行ウィンドウで実行します。実行操作は「新しい」設定で実行されます。

いくつかの解決策を考えることができますが、どちらにもあまり満足していません。

  1. リポジトリからオブジェクトをチェックアウトすると、常にクローンが返されます。変更を保存したい場合は、オブジェクトをリポジトリに明示的にコミットする必要があります。これは小さなオブジェクトにはうまく機能しますが、オブジェクト モデルが大きい場合、すべてを複製するのは妥当ではないかもしれません。
  2. ビュー モデルまたはモデルは中間の変更を格納し、ユーザーが変更を適用する必要があると判断するまで、基になるドメイン オブジェクトを変更しません。これは少し面倒に思えますし、ビューモデルに多くの検証ルールを必要とし、それをドメイン オブジェクトに含める必要があります。
  3. UI は、ドメイン オブジェクトに対して直接機能しません。むしろ、ユーザーが変更を適用するときにドメイン オブジェクトに適用できる DTO を変更します。

同時編集者は 1 人だけですが、複数の同時「閲覧者」が存在する可能性があることに注意してください。また、同時実行性も問題になりません (マルチスレッド環境でオブジェクトが部分的に更新されるという意味で)。

変更がコミットされるまで、変更を適用せずにドメイン オブジェクトを編集するためのパターンを実装するにはどうすればよいでしょうか? 私が調べるべきフレームワークはありますか?

4

1 に答える 1

3

Command パターンは、ここで役立つものになると思います。
基本的に、編集ウィンドウを実装して、オブジェクトを直接操作するのではなく、UI のデータに従ってオブジェクトを変更するコマンドを作成します。[適用] をクリックすると、オブジェクトに対してこれらのコマンドが実行され、ユーザーが選択した状態になります。

もう 1 つの方法は、編集ウィンドウと実行ウィンドウにそれぞれ独自のインスタンスを与え、ユーザーが [適用] をクリックした後で実行ウィンドウのオブジェクトを「何らかの方法で」同期することです。ただし、多くの結合を導入せずにこれをどのように実装するかはよくわかりません。

3 番目のアプローチは、私が実装するもの
です。MVVM を使用しているため、編集ウィンドウと実行ウィンドウの両方に独自のViewModelインスタンスがあります。ViewModel は、ドメイン オブジェクトのインスタンスを保持できます。両方の ViewModel は、ドメイン オブジェクトの同じインスタンスへのインスタンスを保持します。
これで、ViewModel は次の方法で実装できます。

  1. そのプロパティ ゲッターは、変更 (以下を参照) が存在しない場合、基になるドメイン オブジェクトの値を返します。
  2. ViewModel のプロパティ セッターが呼び出されると、値はドメイン オブジェクトではなく、ViewModel の対応するフィールドに書き込まれます。それは変化です。今後、ViewModel はその値を返します。
  3. ViewModel には、変更をドメイン オブジェクトに書き込むメソッドがあります。このメソッドは自動的に呼び出されるのではなく、ユーザーが [編集] ウィンドウで [適用] をクリックしたときに呼び出されます。
  4. 実行ウィンドウの ViewModel は、変更がないため、基になるドメイン オブジェクトから常にデータを返します。
于 2012-11-23T08:34:39.903 に答える