【问题标题】:DDD - domain service to store entity in not primary infrastructureDDD - 将实体存储在非主要基础设施中的域服务
【发布时间】:2021-01-18 09:21:13
【问题描述】:

我正在以领域驱动设计的方式考虑场景,其中我有实体,比如说 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。因为它将用于非状态更改目的的逻辑分离到基础架构中,但也有人担心,我们应该知道搜索是我们应用程序的重要组成部分。

【问题讨论】:

    标签: domain-driven-design domainservices domain-events


    【解决方案1】:

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

    【讨论】:

    • 感谢您的参与。我可以看到一些新词,你能给我一些链接来阅读更多关于投影和读/写模型的信息吗?
    • 顺便说一句,实体不拥有存储库,它作为方法参数提供
    • 通过将存储库传递给实体,您将持久性责任添加到模型中。它不应该关心的东西。相反,将事件调度程序添加为存储库的依赖项并将实体传递给存储库方法。实体是关于域的,存储库是关于持久性的。这里管理得很好github.com/broadway/broadway/blob/master/src/Broadway/…
    • 关于读写模型dev.to/barryosull/…
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多