当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot和MongoDB的域事件

狄兴业
2023-03-14

我正在使用dddspring使用mongoDB

既然MongoDB是一个DocumentDB并且没有模式验证,那么AggregateRoot和存储在MongoDB中的Document类是两个不同的类,Repository在将数据读写到数据库时在这两个类之间转换内容。

由于根实体类与存储到DB的类不同,所以Spring不会触发AggregateRootDomainEvents

>

  • 在将数据存储到数据库后,有没有一种方法可以从存储库中触发根实体的事件?(可能通过显式调用)

    因为MongoDB和聚合是1:1匹配。那么,这是否意味着我们通常不应该创建两个不同的类,一个是aggregateRoot,另一个是Document类,用于在MongoDB中存储聚合根?难道我们不需要在聚合的基础上添加@Document注释吗?

  • 共有1个答案

    施慈
    2023-03-14

    过了一会儿,我想出了解决办法,从投票结果来看,我相信其他人也面临着同样的问题,下面是解决办法:

    回答:是的,我们可以。在Springboot中,我们可以使用/AutowireApplicationEventPublisher接口,然后调用PublishEvent(event)方法。

    如果要为Db集合和聚合创建一个单独的类,则需要在聚合中公开DomainEvents和用于ClearingDomainEvents的方法,因为AbstractAggregateRoot 将这些方法作为protected。下面是在创建时引发事件的示例:

    public class MyAggregateRootClass extends AbstractAggregateRoot<MyAggregateRootClass> 
    {
        public MyAggregateRootClass(String property1, String property2) {
    
            // set the fields here
            registerEvent(new MyAggregateRootCreated(someArgs));
        }
    
        public Collection<Object> getDomainEvents() {
            return super.domainEvents();
        }
    
        public void clearDomainEvents() {
            super.clearDomainEvents();
        }
    }
    

    存储库代码如下所示:

    @Repository
    @RequiredArgsConstructor // using lombok here, you can create a constructor if you want
    public class MyAggregateRepository {
    
        private final ApplicationEventPublisher eventPublisher;
    
        private final AggregateMongoRepository repository;
    
        public void save(MyAggregateRootClass aggToSave) {
    
            AggregateDao convertedAgg = new AggregateDao(aggToSave);
    
            repository.save(convertedAgg);
    
            // raise all the domain events
            for (Object event : aggToSave.getDomainEvents())
                eventPublisher.publishEvent(event);
    
            // clear them since all events have been raised
            aggToSave.clearDomainEvents();
        }
    }
    

    回答:不,这并不意味着。DDD的目标是将基础结构分开,并使不知道所有基础结构代码。如果两者相同,则以下是影响:

    • 如果在聚合类上使用@document批注,则在转换框架或用SQL交换MongoDB时,将更改
    • 以后,如果数据库架构需要更改,则必须同时更改聚合类或设置适配器类。
    • 因为域只应在业务需求发生变化而不是因为基础结构依赖项而发生变化,所以将基础结构注释悄悄插入到聚合库中不是最佳方法
    • 如果您完全确定永远不会切换DBs或更改框架。
    • 您有一个简单的域模型,不需要将聚合实体存储在单独的集合中,而且这些实体不可能成长为自己的聚合

    最后要看情况而定。请随意发表评论,我会尽我所能回答所有的评论,在堆栈上相当活跃。

     类似资料:
    • 我在GET api中有多个查询参数(如姓名、年龄、性别、位置等…n个数字)。现在我需要使用这些查询值来查询我的mongo数据库。现在用户可以发送从0到n的查询参数。 我正在尝试使用类似的东西 或者 但问题是,考虑到用户可以发送的所有排列和组合,我将不得不编写多个查询。有没有更好的方法来做到这一点?

    • 本文向大家介绍SpringBoot实现的Mongodb管理工具使用解析,包括了SpringBoot实现的Mongodb管理工具使用解析的使用技巧和注意事项,需要的朋友参考一下 项目介绍 Mongodb网页管理工具,基于Spring Boot2.0,前端采用layerUI实现。 源于线上环境部署mongodb时屏蔽了外网访问mongodb,所以使用不了mongochef这样方便的远程连接工具,便Mo

    • 主要内容:额外开销,RAM 使用,查询限制,索引键限制,插入超过索引键限制的文档,最大范围本节我们来介绍以下使用索引时的一些限制和注意事项。 额外开销 每个索引都会占用一些空间,并且在每次执行插入、更新和删除等操作时也需要对索引进行操作,导致额外的开销。因此,如果您很少将某个集合用于读取操作,最好不要在集合中使用索引。 RAM 使用 由于索引存储在 RAM(内存)中,因此应确保索引的总大小不超过 RAM 的限制。如果总大小大于 RAM 的大小,那么 MongoDB 将删除一些索引,这就

    • 我正在尝试使用@Query注释从Spring Boot MongoRepository执行一个复杂的GeoQuery。以下是我的文档: 我需要我的查询执行以下任务: null

    • 问题内容: 我正在尝试使用Mongoose将AngularJS与MongoDB连接。我想传递控制器要使用的模型,所以我可以$ scope到数据。我不确定是否必须设置Angular Service,如果可以,您是否可以指出正确的方向。谢谢。 概述: 模型: 控制器: 问题答案: 您将需要一个临时步骤。直接从Angular转到Mongo是行不通的。如果您想要Mongo的通用REST接口,可以使用Ang

    • 本文向大家介绍MongoDB使用updateOne()和insertOne(),包括了MongoDB使用updateOne()和insertOne()的使用技巧和注意事项,需要的朋友参考一下 MongoDB insertOne()将文档插入到集合中,而updateOne()基于查询过滤器更新集合中的单个文档。 让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产