Domain driven design 用于查询聚合根的子级的存储库方法

Domain driven design 用于查询聚合根的子级的存储库方法,domain-driven-design,ddd-repositories,aggregateroot,Domain Driven Design,Ddd Repositories,Aggregateroot,我有Order包含子值对象的聚合根类: class Order { val id: String val lines: Seq[OrderLine] val destination: Destination //...omit other fields } 这是一个CQRS读取模型,由负责通过某些过滤器搜索订单的订单搜索微服务表示 有使用OrderRepository的OrderApplicationService(我不确定它是否是d

我有
Order
包含子值对象的聚合根类:

  class Order {
      val id: String
      val lines: Seq[OrderLine]
      val destination: Destination
      //...omit other fields
    }
这是一个CQRS读取模型,由负责通过某些过滤器搜索订单的
订单搜索
微服务表示

有使用
OrderRepository
OrderApplicationService
(我不确定它是否是ddd术语中的纯存储库):

以及使用ES作为搜索引擎的ElasticSearchOrderRepository

由于新的需求,我需要一种新的api UI方法,通过一些过滤器搜索订单中的所有目的地。应该是
/destinations
端点,它将调用存储库来查找所有数据。在这种情况下,性能很重要,因此搜索所有订单并将其映射到
目的地
似乎不是一个好的解决方案

解决这个问题最合适的方法是什么

  • OrderRepository
    中添加新方法,例如
    def searchOrderDestinations(过滤器:DestinationFilter):Seq[Destination]
  • 创建新存储库:
  • 应用程序服务也是如此-我是否需要创建新的
    DestinationAppService

    这些选项是否适用?或者有更好的解决办法? 提前谢谢

    这是一个CQRS读取模型

    完美-创建并更新按目的地索引的订单列表,并使用该列表提供查询结果

    考虑“包含创建视图所需数据和索引的关系数据库”。查询转到数据库,数据库充当信息的缓存。后台进程(异步)运行以更新数据库中的信息


    运行该进程的频率取决于视图中数据的陈旧程度。如果视图显示10分钟前的结果,对业务有多坏?从1分钟前开始?一小时前?

    您正在查询订单以检索目的地列表。我想说,因为订单拥有与目的地的关系,所以最好将其添加到您的订单存储库和服务中。你担心什么?是的,有道理。但一般来说,如何处理此类案件?当我不需要整个聚合根,而只需要它的一部分数据时。例如,我可以应用一些投影来减少db或ES的负载。假设我不想拿到所有的订单。在同一存储库中只获取实体子项(而不是整个实体)好吗?
    trait OrderRepository {      
      def search(filter:OrderFilter):Seq[Order]      
      def findById(orderId:String):Order      
    }
    
        trait OrderDestinationRepository {
          def searchOrderDestinations(filter:DestinationFilter): Seq[Destination]
        }