我正在考虑将DDD用于我们的下一个应用程序。我已经找到了很多有趣的论文和答案,但无法找到解决问题的方法:
我们有一个SOA。架构,其中一些服务被称为其数据的主人。这很好,但我无法想象如何与DDD很好地使用它们。
如果服务“员工”是Employee
数据的主人,那么对于几个简单的值(名字和姓氏,生日,地址)来说,这是一个小问题。
我的新应用程序应跟踪为这些员工提供的培训。所以我有Participant
的概念,Participant
具有与Employee
相同的值以及培训和技能列表。
我们可以假设“trainings”应用程序有一个数据库,其中包含一个参与者表,其中包含用于检索名字和姓氏的participant_id
,skill
和一个employee_id
。< / p>
我说错了吗?
但是现在,我可以使用哪个组件来调用“员工”服务?它是ParticipantRepository
所以当我得到一个参与者时,我有名字。或者是应用程序服务在使用它们之前完成Participant
数据。或者我可以在需要时明确地呼叫员工服务吗?
非常感谢。
答案 0 :(得分:1)
在您的培训申请中(我的意思是在您的申请领域),员工的概念可能不会作为外部参考而存在。正如你所说,那将是参与者。
我知道您需要从员工服务中获取一些数据来填充参与者。我可以想到几个选择。
1)ParticipantRepository构建一个参与者,它是一个聚合根,其中一些数据可能在PersonalDetails
值对象中。通过调用employee app构造此值对象。这种方法很简单,但可能不是最好的方法。这是您提到的方法,其中ParticipantRepository调用接口PersonalDetailsService
,并且该接口的实现执行对Employee服务的实际调用。通过这种方式,您的域名不知道与员工打交道,因为它只看到PersonalDetails。
2)通过复制员工服务中的数据实现最终一致性:如果员工服务可以在员工更新时发送通知(例如通过消息传递),您可以收听这些事件并拥有数据的只读副本。这样做的好处是,即使员工服务中断,您的应用也会正常运行。问题是你可能需要构建一些东西来重新发送可能丢失的数据。
一书中都有很好的解释