2017-06-12 3 views
2

私のドメインには、人を表すUserというエンティティと、ビジネスを表すエンティティTenantがあるとします。 adminUserInstance.CreateUser(newUserDTO);
- - tenantInstance.CreateUser(newUserDTO)

DDD - エンティティはエンティティを作成する必要がありますか?

一つは、これは管理ユーザーであり、そのようなものとして、コードの面で基本的に3の形に変換されるだろう新しいユーザーを登録することができるはずだと思うかもしれません - newUserInstace.SelfSave()

newUserInstace.SelfSave()は自己登録の必要性から、他の2つは意味がありますか?私は自分の登録だけを保持し、同じユーザーが複数のテナントに加わることができる所属モデルに変わるべきですか?より広範な用語で

Questions/AnswersUsersまたは自己作成し、与えられたUserに縛らによって作成されなければなりませんか?エンティティが他の(他のエンティティではない)エンティティを作成するための知識を保持しているか、エンティティが自分自身を作成し​​、「リクエスタ」を持つことができるべきかどうか(たとえば、それらをバンドルするドメインサービスを呼び出しますか?

答えて

2

より広い意味で:質問/回答はユーザーによって作成されるか、作成され、次に特定のユーザーに結びつくべきですか?エンティティが他の(他のエンティティではない)エンティティを作成するための知識を保持しているか、エンティティが自分自身を作成し​​、「リクエスタ」を持つことができるべきかどうか(たとえば、それらをバンドルするドメインサービスを呼び出しますか?

Udi Dahanのテクニカルガイダンスでは、常にエンティティを取得して新しいエンティティを作成する必要があります。 「顧客は薄い空気から出てくるだけではありません。つまり、集約ルートエンティティの作成は、weirdです。 「間違っていない」とは限りませんが、変更しようとしている集合にコマンドをディスパッチする通常のパターンから逸脱しています。

2

Entitiesは、entitiesで作成できますが、同じaggregateの中にのみ作成できます。したがって、aggregateentityを作成した場合、entityはネストされたentityです。それはaggregate's境界の外で参照することはできません。 aggregateにはいくつかの不変量を適用する必要があるため、を設計するときには、入れ子にしたentitiesの作成をaggregateに入れます。

一方、aggregate rootsAR)は、クライアントコード(ほとんどの場合Applicationサービス)によって作成されますが、ARは、それ自身の不変条件を強制します!だから、PHPのコードでは、これは次のようになります。

//somewhere in an Application service 
function createUser($id, $username, $password) 
{ 
    $user = new User(); //an AR should always be new-able, i.e. with not injected dependencies 

    $user->registerNew($id, $username, $password); //here the invariants are enforced 

    $this->userRepository->addOrSave($user); 
} 

newUserInstace.SelfSave()

aggregateは(持続)自体を "保存" しません。それはApplicationサービスの仕事です。とにかく、「保存」はあなたの普遍的な言語からのものではないようですが、より適切な名前(「登録」)が必要です。

関連する問題