13

SO: How update an entity inside Aggregateに関する同様の質問を読んでいましたが、ユーザー インターフェイスが集約内のエンティティとどのようにやり取りする必要があるかはまだわかりません。

esUserがたくさんある ,があるとしましょう。Addressユーザーは集約ルートですが、アドレスは集約内にのみ存在します。

Web インターフェイスで、ユーザーは自分のアドレスを編集できます。基本的に、何が起こるか:

  • ユーザーの Web インターフェイスにアドレスのリストが表示されます。
  • アドレスをクリックすると、次のページにリダイレクトされます。edit-address?user=1&address=2
  • このページで、彼はこの住所を変更できるフォームを取得します。

集約ルートをバイパスすることにしましたが、これは簡単です。

  • を直接ロードAddressしますId
  • 更新してから保存します

DDD の方法で実行したいので、さまざまな解決策があります。

  1. Id でこのアドレスを取得するようにユーザーに依頼します。

    address = user.getAddress(id);
    address.setPostCode("12345");
    address.setCity("New York");
    em.persist(user);

    このアプローチの問題点は、IMO によると、集約ルートがまだアドレスの処理をあまり制御できないことです。それへの参照を返すだけなので、集約をバイパスすることと大差ありません。

  2. または、集約に既存のアドレスを更新するように指示します

    user.updateAddress(id, "12345", "New York");
    em.persist(user);

    これで、集約はこのアドレスの処理を制御できるようになり、アドレスの更新に必要なアクションを実行できます。

  3. または、 Address を値オブジェクトとして扱い、を更新せずAddressに、削除して再作成します

    user.removeAddress(id);
    address = new Address();
    address.setPostCode("12345");
    address.setCity("New York");
    user.addAddress(address);
    em.persist(user);

    この最後の解決策は洗練されているように見えますが、Address をエンティティにすることはできません。次に、たとえば集約内の別のビジネス オブジェクトがそれを参照しているなどの理由で、それをentity として扱う必要がある場合はどうなるでしょうか。

集計の概念と、それが実際の例でどのように使用されているかを正しく理解するために、ここで何かが欠けていると確信しているので、遠慮なくコメントをお寄せください!

4

1 に答える 1

7

いいえ、何も見逃していません-ほとんどの場合、最良のオプションは2番changeAddressです(ただし、代わりにそのメソッドを呼び出しますupdateAdress-更新はDDDではないようです)。これは、アドレスがエンティティまたは値オブジェクトであるかどうかに関係ありません。ユビキタス言語では、ユーザーが自分のアドレスを変更したと言いたいので、まさにそれをモデル化する必要があります。changeAddressプロパティを更新するか (アドレスがエンティティの場合)、まったく新しいオブジェクトを割り当てるか (VO の場合) を決定するメソッドです。 .

次のサンプル コードは、最も一般的なシナリオである Address as VO を想定しています。

    public void ChangeAddress(AddressParams addressParams)
    {
        // here we might include some validation

        address = new Address(addressParams);

        // here we might include additional actions related with changing address
        // for example marking user as required to confirm address before
        // next billing
    }

このサンプルで重要なことは、Address が作成されると、それが有効であると見なされることです。つまり、集計に無効な Address オブジェクトが存在することはありません。ただし、このサンプルに従うべきかどうかは、実際のドメインによって異なります。従うべき道は 1 つではありません。これは最も一般的なものですが。

そして、はい、常に集計ルートをトラバースしてエンティティに対して操作を実行する必要があります-その理由は、SO に関する多くの回答で示されています (たとえば、この Basic Aggregate Question )。

何かがエンティティか VO かは、要件とドメインによって異なります。ほとんどの場合、アドレスは単なる値オブジェクトです。これは、同じ値を持つ 2 つのアドレスに違いはなく、アドレスは存続期間中に変更されない傾向があるためです。しかし、繰り返しになりますが、それはほとんどの場合であり、モデリングしているドメインによって異なります。

別の例 - ほとんどのドメインでMoneyは a は値オブジェクトになります - 10$ は 10$ であり、金額以外に ID はありません。ただし、請求書のレベルでお金を扱うドメインをモデル化すると、各請求書は独自の ID (ある種の一意の番号で表される) を持つため、エンティティになります。

于 2011-08-25T23:06:30.343 に答える