独特的DDD验证

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

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

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

  • 用户模型引用UserRepository,在Validate()中进行唯一性检查
  • 使用UserRepository创建一个域服务来完成唯一性检查(这对我来说看起来有点奇怪,因为我认为域服务通常只用于跨越多个域模型的情况)
  • 在域层创建一个规范对象,引用UserRepository来封装唯一的检查规则,应用程序服务层使用它在update / insert之前进行检查
  • 如果我使用依赖注入,我仍然想知道如何将UserRepository注入方法1中的User,或方法2中的域服务或方法3中的应用程序服务,因为在任何情况下,对于用户/域服务/规范对象,我需要手动实例化对象,所以我唯一的选择似乎是在IoC中使用服务定位器来获取实例。 但服务定位器是一种反模式,所以我想避免它

    任何示例代码将不胜感激


    我认为检查唯一性属于知识库责任。 知识库知道所有的聚合,因为它假设模拟域的收集,所以很自然地要求存储库的唯一性(例如,你希望从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可能不应该从用户聚合中调用,我会将此调用移入应用程序或域服务,具体取决于应用程序的其余部分的结构。

    请参阅CQRS架构中的唯一性验证以获取替代方法。

    链接地址: http://www.djcxy.com/p/71721.html

    上一篇: unique validation in DDD

    下一篇: Discrete optimzation in python