私はシステムを設計するためにドメイン駆動設計規則に従っています。サービス、外部システム、検証について疑問があります。
アグリゲートは、他のシステムのWebサービスと対話して、検証を行い、情報を提供する必要があります。アグリゲートが外部の単語にアクセスできるようにするのが良い考えかどうかはわかりません。外部サービスにアクセスするためのサービスを作成すると、不変条件と検証を適用するのに問題があります。すべてのロジックを集約に入れると、良い考えには聞こえませんが、これらの問題は解消されたようです。
問題を理解しやすくするために、ユーザーアグリゲートがあり、電子メールが正しいことを確認するために電子メールを送信する必要があるとします(私の実際の問題では、外部のWebサービスと通信する必要があります)
public class User {
public User (Long id, String name, String email) {...}
public changeEmail(String newEmail) {...}
...
}
public interface EmailValidatorService {
/**
* Sends a test email
*/
public verifyEmail(String email) throws EmailException;
}
これが良いアイデアなのか、それともメール検証ロジックをユーザーアグリゲートの一部にするべきなのかはわかりません。おそらくそれはサービスであり、Useraggregateがそれを使用する可能性があります...しかしそれも良い考えのようには思えません。
それがユーザー集合体の一部である場合、それは追加の責任を負い、それがサービスである場合、ドメインルールを適用する簡単な方法がわかりません。¿開発者がサービスで検証せずにchangeEmailを使用した場合はどうなりますか?