这个问题乍一看对我来说似乎很愚蠢,但是后来我意识到我还没有一个正确的答案,有趣的是,在我的搜索中也找不到很好的解释。我是域驱动设计概念的新手,因此,即使问题很简单,也可以随时添加任何注意事项。
[我正在用Rest API设计以配置服务器实例,然后我想到了一个名为Instance
的聚合,其中包含Configurations
的列表,在给定的时间只有一个特定的配置处于活动状态。
要添加配置,将调用端点POST /instances/{id}/configurations
,并将主体置于所需的配置上。作为响应,如果一切正常,它将收到带有包含新配置ID的标头位置的HTTP 204。
我计划只有一个控制器InstanceController
,它将调用InstanceService
来操纵实例聚合,然后将其存储到存储库。
由于ID是由存储库生成的,如果我依次调用Instance.addConfiguration
和InstanceRepository.store
,我将如何获取新创建的配置的ID?我的意思是,这是一个列表,因此调用Instance.configuration.identity
一个选项将在实例中实现一个方法,例如getLastAddedConfiguration
,但这似乎很脆弱。
在这种情况下,一般的做法是什么?
ID由存储库生成
您可以消除这种额外的复杂性。由于Configuration
是Instance
集合的实体,因此Id
仅需要在集合内部是唯一的,而不需要在整个应用程序中唯一。因此,最简单的方法是,在ConfigurationId
方法中,集合为Instance.addConfiguration
赋值(因为集合可以轻松确保新Id
的唯一性)。此方法可以返回新的ConfigurationId
(或必要时返回带有ID的整个对象)。
这种情况下的一般方法是什么?
我不确定一般方法,但是我认为,创建ID越早越好。对于聚合,您可以在存储ID(可能是GUID)之前创建ID,对于实体,聚合可以在创建/添加实体时创建它。这使您可以使用这些Id执行其他操作(例如发布事件),而不必从数据库中存储和检索Id,这必然会对实现和使用存储库的方式产生影响,这并不理想。