问题描述
我正在以领域驱动设计的方式考虑场景,在那里我有实体,比如说 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。因为它将用于非状态更改目的的逻辑分离到基础设施中,但也有问题,我们应该知道搜索是我们应用程序的重要组成部分。
解决方法
您在这里面对的是读写模型。理想情况下,在写入模型中持久化实体/聚合后,您应该调度该实体的未提交事件并列出/订阅它们以生成投影(在您的用例中为弹性部分)。供参考:https://github.com/jorge07/symfony-5-es-cqrs-boilerplate/blob/symfony-5/src/Infrastructure/User/ReadModel/Projections/UserProjectionFactory.php#L17 IMO,实体不应包含存储库。