我是 DDD 的新手,我正试着把它应用到现实生活中。对于直接进入实体构造函数/属性的验证逻辑,如 null 检查、空字符串检查等,没有任何问题。但是像“唯一用户名”这样的全局规则的验证应该放在哪里呢?
所以,我们有实体用户
public class User : IAggregateRoot
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
// other data and behavior
}
以及用户的存储库
public interface IUserRepository : IRepository<User>
{
User FindByName(string name);
}
选择包括:
每个选项都更加详细:
1. 向实体注入存储库
我可以在实体构造函数/属性中查询存储库。但是我认为在实体中保留对存储库的引用是不好的。
public User(IUserRepository repository)
{
_repository = repository;
}
public string Name
{
get { return _name; }
set
{
if (_repository.FindByName(value) != null)
throw new UserAlreadyExistsException();
_name = value;
}
}
更新: 我们可以使用 DI 通过规范对象隐藏 User 和 IUserRepository 之间的依赖关系。
2. 向工厂注入仓库
我可以把这个验证逻辑放到 UserFactory 中,但是如果我们想要更改已经存在的用户的名称呢?
3. 创建域服务操作
我可以为创建和编辑用户创建域服务。但有人可以直接编辑用户的名称,而无需调用该服务..。
public class AdministrationService
{
private IUserRepository _userRepository;
public AdministrationService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void RenameUser(string oldName, string newName)
{
if (_userRepository.FindByName(newName) != null)
throw new UserAlreadyExistException();
User user = _userRepository.FindByName(oldName);
user.Name = newName;
_userRepository.Save(user);
}
}
4个?
实体的全局验证逻辑放在哪里?
谢谢!