dependency-injection - DDD 中的唯一验证

标签 dependency-injection repository domain-driven-design unique specifications

我有一个关于检查 DDD 中唯一性的问题。我知道在stackoverflow上已经对此有一些疑问,但他们并没有真正回答我的疑问

在更新/插入数据库时​​,聚合根是否可以保存存储库的引用以检查唯一性?或者这是由应用程序服务而不是域模型完成的任务?

假设我想在用户注册时检查用户模型的用户名是否唯一
我可以想到几种方法:

  • 用户模型引用 UserRepository,在 Validate()
  • 中做唯一性检查
  • 使用 UserRepository 创建一个域服务来进行唯一性检查(这对我来说似乎有点奇怪,因为我认为通常只有在逻辑跨越多个域模型的情况下才使用域服务)
  • 在领域层创建一个规范对象,引用UserRepository封装唯一的校验规则,应用服务层用它来做更新/插入前的校验

  • 如果我使用依赖注入(inject),我仍然想知道如何将 UserRepository 注入(inject)方法 1 中的 User 或方法 2 中的域服务或方法 3 中的应用程序服务,因为无论如何,对于用户/域服务/规范对象,我需要手动实例化对象,所以我唯一的选择似乎是在 IoC 中使用服务定位器来获取实例。但是服务定位器是一种反模式,所以我想避免它

    任何示例代码将不胜感激

    最佳答案

    我认为检查唯一性属于存储库的责任。 Repository 知道所有聚合,因为它假设模拟域集合,因此向 Repository 询问唯一性是很自然的(就像您对 HashMap 的期望一样)。

    // repository
    interface Users {
      // implementation executes SQL COUNT in case of relation DB
      bool IsNameUnique(String name);
    
      // implementation will call IsNameUnique and throw if it fails
      void Add(User user);
    }
    

    从某种意义上说,这是一种泄漏抽象,因为在多用户环境中,这需要在数据存储端强制执行(例如,UNIQUE SQL 约束或锁定)。

    IsNameUnique 可能不应该从用户聚合中调用,我会将此调用移动到应用程序或域服务中,具体取决于应用程序其余部分的结构。

    Uniqueness validation in CQRS Architecture对于替代方法。

    关于dependency-injection - DDD 中的唯一验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16827710/

    相关文章:

    c# - 在 Unity 中的类型之间共享生命周期管理器?

    angular - 尝试手动注入(inject) NgControl 时出现 Lint 警告 "get is deprecated"

    git - 更改 Git Bash 上的默认位置

    svn 和 git 版本控制模型的区别

    svn 创建主干和分支

    flutter - 在 Flutter 中不将 MethodChannels 设置为静态常量有缺点吗?

    design-patterns - 您如何使用 DDD 对保存图像的操作进行建模?

    java - DDD 对于基于搜索的应用程序有好处吗?

    c# - 存储库类应该在哪里?

    java - 如何将场注入(inject)与 Action 组合一起使用?