domain-driven-design - 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。因为它将用于非状态更改目的的逻辑分离到基础设施中,但也有人担心,我们应该知道搜索是我们应用程序的重要组成部分。
解决方案
你在这里面对的是写和读模型。理想情况下,在写入模型中保留您的实体/聚合之后,您应该分派该实体的未提交事件并列出/订阅它们以生成投影(在您的用例中为弹性部分)。供参考:https ://github.com/jorge07/symfony-5-es-cqrs-boilerplate/blob/symfony-5/src/Infrastructure/User/ReadModel/Projections/UserProjectionFactory.php#L17 IMO,实体不应包含存储库。
推荐阅读
- java - 升级到 Spring-5 后加载时编织停止工作
- java - 如何用java比较两个XML文件?
- sql - 查找后续电影的较低评分
- spring-boot - 带有参数的thymeleaf 3表单操作URL和get方法不起作用
- arrays - 当函数/过程需要使用接口类型的数组时,传递使用实现接口的类类型的数组?
- javascript - Cloud Functions 在超时后继续执行
- types - 什么比喻最能描述“价值”和“类型”之间的关系?
- c# - 替换部分字符串 C#
- db2 - DB2 如何将下面的“with temp as”转换为普通的select语句
- r - 获取 R Shiny 中异步期货子进程的 PID