私は DDD を初めて使用するので、DDD の実装で直面しているいくつかの課題についてアドバイスをお願いします。
Typescript を使用してアプリケーションを開発しています。データはリレーショナル DB に永続化されます。私たちは CQRS パターンに従っておらず、読み取りと書き込みは同じデータベースで行われます。
User
おおよそ以下のような集計があると仮定しましょう。
class User extends AggregateRoot {
id: number;
phone: Phone;
email: Email;
address: Address;
private constructor(id, phone, email, address){
//setting the values
}
public static create(props) {
return new User({...props});
}
public static update(props) {
return new User({...props});
}
}
ここではPhone
、Email
はValueObjects
であり、Address
はEntity
です。
class Phone extends ValueObject {
phNumber: string;
private constructor( ph ) {
phNumber = ph;
}
public static create(ph){
//do validations
return new Phone(ph);
}
}
クラスEmail
も に似ていPhone
ます。
ここで、電話の更新リクエストがコントローラーで受信されると、リクエストはUser Service
レイヤーに転送され、サービスは大まかに次のようになります。
public updatePhone( updatePhNoDto ) {
const userEntity = userRepository.getUser(updatePhNoDto.userId);
const userModel = User.update({
id: updatePhNoDto.userId,
phone: Phone.create(userEntity.phone),
email: Email.create(userEntity.email),
address: Address.create(userEntity.address)
});
userRepository.updateUser(userModel)
}
ここでは、ユーザーが電話番号の更新を要求するたびに、RDBMS からユーザー データを取得し、既に検証済みのすべてのフィールドに対してすべての検証を行ってから、メソッドを呼び出していUser.update()
ます。だから、ここに私の質問があります:
- 上記が正しい方法であるかどうかはわかりません。既に検証済みのものと、おそらく不要な DB 呼び出しを検証しているためです。そのため、このような単一または少数のフィールドの更新が要求されている状況に対処するためのベスト プラクティスを提案してください。
- ユーザーは、他の情報とは関係なく自分の住所を更新できます。
Address
では、エンティティはAggregate Root
それ自体である必要がありますか? はいの場合、単一の http 要求で UserInfo と Address の両方を更新するように要求された場合、どのように処理する必要がありますか? - 削除における集約ルートの役割は何ですか? それはその中でどのようにモデル化されるべきですか?
他にデザインの不具合等ありましたらご指摘ください。
ありがとう!