複数の集計が関係している場合に、ドメインがビジネス ルールを適用する方法について疑問があります。
アカウントと外部アカウントの集計があるとします。
public class Account {
public String getId() {...}
public void add (Double amount) {}
}
public class ExternalAccount {
public String getId() {...}
public void add (Double amount) {}
}
そしてこのサービス:
public class TransferService implements TransferServiceInterface {
public void transfer (String AccountId, String ExternalAccountId, Double amount) {
Account fromAccount = accRepository.get(AccountId);
ExternalAccount toAccount = extAccRepository.get(ExternalAccountId);
transferIsValid(fromAccount, toAccount, amount);
fromAccount.add(-amount);
toAccount.add(amount);
}
}
転送がドメイン ルールに準拠していない場合、transferIsValid は例外をスローします。
このモデルのユーザーがサービスを使用しないようにして、次のようなことを実行するにはどうすればよいですか:
Account fromAccount = accRepository.get(AccountId);
ExternalAccount toAccount = extAccRepository.get(ExternalAccountId);
fromAccount.add(-amount);
toAccount.add(amount);
ユーザーはサービスを使用せず、整合性をチェックするために transferIsValid(...) を使用しませんでした。ユーザーが無効なことを行うことはできないため、設計にエラーがあると思います。どうすれば防ぐことができますか?デザインのどこにエラーがありますか?