我有两个聚合,Employee
和 Company
。 Employee
通过它的 UUID
存储对 Company
的引用。
如果我想创建一个员工,我需要提供公司ID:
new Employee(name, companyId)
我无法理解的是,如果客户端仅提供公司名称,如何获取 Company
的 id
。换句话说,我看到了这种情况:
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/