我正在从事我的第一个 DDD 项目,我想我了解实体、数据访问对象及其关系的基本角色。我有一个基本的验证实现,它存储每个验证规则及其关联的实体。这适用于仅适用于当前实体的规则,但在需要其他数据时会分崩离析。例如,如果我有用户名必须是唯一的限制,我希望 IsValid() 调用在存在具有当前名称的现有用户时返回 false。
但是,我没有找到任何干净的方法来将此验证规则保留在实体本身上。我想在实体上有一个 IsNameUnique 函数,但大多数解决方案都需要我注入(inject)一个用户数据访问对象。这个逻辑应该在外部服务中吗?如果是这样,我如何仍然保持实体本身的逻辑?或者这是应该在用户实体之外的东西?
谢谢!
最佳答案
我喜欢塞缪尔的回应,但为了简单起见,我建议实现 Specification .您创建一个返回 bool 值的规范,以查看对象是否满足特定条件。将 IUserRepository 注入(inject)规范,检查是否已存在具有该名称的用户,并返回 bool 结果。
public interface ISpecification<T>
{
bool IsSatisfiedBy(TEntity entity);
}
public class UniqueUsernameSpecification : ISpecification<User>
{
private readonly IUserRepository _userRepository;
public UniqueUsernameSpecification(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public bool IsSatisfiedBy(User user)
{
User foundUser = _userRepository.FindUserByUsername(user.Username);
return foundUser == null;
}
}
//App code
User newUser;
// ... registration stuff...
var userRepository = new UserRepository();
var uniqueUserSpec = new UniqueUsernameSpecification(userRepository);
if (uniqueUserSpec.IsSatisfiedBy(newUser))
{
// proceed
}
关于c# - 我应该在 DDD 中的什么地方进行独特的检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/998317/