DDD域服务,用于在非主要基础设施中存储实体



我正在考虑以领域驱动设计的方式的场景,其中我有实体,让我们说Cv(简历),该状态通过存储库保存在数据库中。

现在我需要将Cv的一部分存储在另一个系统(ElasticSearch)中,这对于整个应用程序的功能(如搜索)至关重要。

如何处理?我在考虑这两个选项:

1。使用域服务IndexCvGatewayServiceInterface(作为基础架构中实现的接口)

class CvEntity
{
public function approve(CvRepositoryInterface $cvRepository, IndexCvGatewayServiceInterface $indexService)
{
$cvRepository->update($this);
$indexService->update($this);
}
}

2。监听域事件(创建基础设施监听器)

class CvEntity
{
public function approve(CvRepositoryInterface $cvRepository, EventDispatcheInterface $dispatcher)
{
$cvRepository->update($this);
$dispatcher->dispatch(new CvApprovedEvent($this));
}
}

我喜欢选项2。因为它将用于非状态更改目的的逻辑分离到基础设施中,但也有担忧,我们应该知道搜索是我们应用程序的重要组成部分。

您面对的是这里的Write and Read模型。理想情况下,在写入模型中持久化实体/聚合之后,您应该调度该实体的未提交事件并列出/订阅它们以生成投影(在您的用例中部分是弹性的)。参考:https://github.com/jorge07/symfony-5-es-cqrs-boilerplate/blob/symfony-5/src/Infrastructure/User/ReadModel/Projections/UserProjectionFactory.php#L17IMO,实体不应该包含存储库。

最新更新