SO: How update an entity inside Aggregateに関する同様の質問を読んでいましたが、ユーザー インターフェイスが集約内のエンティティとどのようにやり取りする必要があるかはまだわかりません。
esUser
がたくさんある ,があるとしましょう。Address
ユーザーは集約ルートですが、アドレスは集約内にのみ存在します。
Web インターフェイスで、ユーザーは自分のアドレスを編集できます。基本的に、何が起こるか:
- ユーザーの Web インターフェイスにアドレスのリストが表示されます。
- アドレスをクリックすると、次のページにリダイレクトされます。
edit-address?user=1&address=2
- このページで、彼はこの住所を変更できるフォームを取得します。
集約ルートをバイパスすることにしましたが、これは簡単です。
- を直接ロード
Address
しますId
- 更新してから保存します
DDD の方法で実行したいので、さまざまな解決策があります。
Id でこのアドレスを取得するようにユーザーに依頼します。
address = user.getAddress(id);
address.setPostCode("12345");
address.setCity("New York");
em.persist(user);
このアプローチの問題点は、IMO によると、集約ルートがまだアドレスの処理をあまり制御できないことです。それへの参照を返すだけなので、集約をバイパスすることと大差ありません。
または、集約に既存のアドレスを更新するように指示します。
user.updateAddress(id, "12345", "New York");
em.persist(user);
これで、集約はこのアドレスの処理を制御できるようになり、アドレスの更新に必要なアクションを実行できます。
または、 Address を値オブジェクトとして扱い、を更新せず
Address
に、削除して再作成します。user.removeAddress(id);
address = new Address();
address.setPostCode("12345");
address.setCity("New York");
user.addAddress(address);
em.persist(user);
この最後の解決策は洗練されているように見えますが、Address をエンティティにすることはできません。次に、たとえば集約内の別のビジネス オブジェクトがそれを参照しているなどの理由で、それをentity として扱う必要がある場合はどうなるでしょうか。
集計の概念と、それが実際の例でどのように使用されているかを正しく理解するために、ここで何かが欠けていると確信しているので、遠慮なくコメントをお寄せください!