我遵循领域驱动的设计规则来设计一个系统。我对服务、外部系统和验证有疑问。
聚合必须与其他系统的 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;
}
我不确定这是否是一个好主意,或者电子邮件验证逻辑是否应该是用户聚合的一部分。也许它可能是一项服务并且用户聚合可以使用它......但这听起来也不是一个好主意。
如果它是用户聚合的一部分,它将承担额外的责任,如果它是一项服务,我看不到执行域规则的简单方法。¿ 如果开发人员使用 changeEmail 而不通过服务验证它怎么办?