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

标签 c# repository domain-driven-design entity

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

相关文章:

domain-driven-design - 在下面的模型中,地址不应该是一个值对象吗?

c# - 使用 C# 文本框更新 Mysql 中的多列

c# - 动态连接/基于表达式的连接字符串 SSRS

c# - 如何在 C++ 中读取 IL

domain-driven-design - DDD/存储库

.net - 领域驱动设计 : How to access child of aggregate root

linq-to-sql - 与 DDD、存储库模式和相关领域模型作斗争

c# - 将包含图像的流保存到 Windows Phone 8 上的本地文件夹

version-control - 在存储库中的项目上选择性 checkout 或查看

c# - 领域驱动设计 - 大型子集合