2016-01-25 31 views
1

我正在考虑为我们的下一个应用程序使用DDD。我已经发现了很多有趣的论文和答案,但找不到解决我的问题的方法:DDD,外部数据和存储库

我们有一个SOA。架构,其中一些服务被称为数据的主人。这很好,但我不知道如何很好地与DDD一起使用它们。

给定一个服务“雇员”谁是Employee数据的主人,它是一个粗略的几个简单的值(姓和名,出生日期,地址)。 我的新应用程序应跟踪向这些员工提供的培训。所以我有Participant的概念,ParticipantEmployee具有相同的值,加上一系列训练和技能。

我们可以假设“培训”的应用与包含用于检索的第一和姓氏一个participant_idskill和一个employee_id参与者表的数据库。

我正确吗?

但是现在,我可以使用哪个组件调用“员工”服务?是ParticipantRepository,所以当我得到一个参与者时,我有名字。或者是在使用它们之前完成Participant数据的应用服务。或者我可以在需要时明确调用员工服务?

非常感谢。

回答

1

在您的培训应用程序中(我的意思是在您的应用程序的域中),员工的概念可能不像外部参考文件那样存在。正如你所说的那样,这将是一个参与者。

我知道您需要从员工服务获取一些数据来填充参与者。我可以想到很少的选择。

1)ParticipantRepository构建一个参与者,这是一个聚合根,其中一些数据可能在一个PersonalDetails值对象中。这个值对象是通过调用雇员应用程序构造的。这种方法很简单,但可能不是最好的。这是您提到的方法,其中ParticipantRepository调用接口PersonalDetailsService,并且该接口的实现执行对Employee服务的实际调用。通过这种方式,您的域名不会与员工打交道,因为它只能看到PersonalDetails。

2)通过复制员工服务中的数据实现最终一致性:如果员工服务可以在更新员工时(例如,通过消息传递)发送通知,则可以收听这些事件并拥有只读数据副本。这样做的好处是,即使员工服务出现故障,您的应用也能正常工作。问题是你可能需要构建一些东西来重新发送可能已经丢失的数据。

这两种方法都很好地解释在书Implementing Domain-Driven Design

+0

优秀的答案。如果现有的系统允许的话,我可能会用2)。 – guillaume31