微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DDD - 在非主要基础设施中存储实体的域服务

如何解决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,实体不应包含存储库。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?