gpt4 book ai didi

c# - 我应该在 DDD 中的什么地方进行独特的检查?

转载 作者:可可西里 更新时间:2023-11-01 08:11:37 25 4
gpt4 key购买 nike

我正在从事我的第一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com