java - 在实现领域驱动设计时,您可以引用工厂中的其他聚合吗?

标签 java domain-driven-design microservices

我有两个聚合,EmployeeCompanyEmployee 通过它的 UUID 存储对 Company 的引用。

如果我想创建一个员工,我需要提供公司ID:

new Employee(name, companyId)

我无法理解的是,如果客户端仅提供公司名称,如何获取 Companyid。换句话说,我看到了这种情况:

Employee buildEmployee(String name, String companyName) {
    Company company = companyRepository.findByName()
    return new Employeee(name, company.getGUID())
}

我觉得有些不对劲,因为现在我已经引入了对 Company 聚合的依赖,以便创建 Employee。更糟糕的是,如果这两个是单独的微服务,因为我必须打个休息电话才能获得公司名称。

有没有办法避免这种耦合,或者我的实体建模不正确?

最佳答案

你的模型目前表达的是

Every employee works for exactly one Company.

有了这个,很明显必须有一个公司才能创建一个员工。

我看到两种不同的解决方案适合这里:

  • 将公司传递给 buildEmployee。这表明创建员工需要最好的公司。

  • 传入公司的GUID。这可能适用于您已经拥有此信息但没有可用的整个公司对象的情况(例如,为现有员工创建同事)。

无论采用哪种方法,都应避免通过工厂内的存储库加载数据。最好将其留给调用应用服务,因为应用服务可能无论如何都需要公司(例如,进行某种输入验证)。

在应用服务中保留所有存储库交互将使您的应用程序更健壮且更易于推理。毕竟,存储库访问通常涉及网络交互和延迟。

总而言之,从 buildEmployee 依赖 Company 没有错,但您应该避免调用存储库。

如果依赖公司仍然感觉不对,那么你应该重新考虑你的模型。

关于java - 在实现领域驱动设计时,您可以引用工厂中的其他聚合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39721791/

相关文章:

java - 是否有一种语言支持变量声明时的隐式复合类型?

c# - 如何在一个工作单元中处理数据库生成的 id 值

events - 不带事件源的 CQRS : handle event log failure

java - jhipster jdl 与微服务导入

java - Jhipster微服务: How to create dynamic instances on microservices in production?

client - 在微服务和客户端库项目之间共享模型是一个好习惯吗?

使用 32 字节 key 的 Java AES 加密 - key 大小无效

java - 基本深拷贝,Java

java - Solr 4 Web界面奇怪的查询输出

nhibernate,无法解析属性 QueryOver 只有一张表