用于查询聚合根的子项的存储库方法



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

class Order {
val id: String
val lines: Seq[OrderLine]
val destination: Destination
//...omit other fields
}

这是一个 CQRS 读取模型,由负责按某个筛选器搜索订单order-search微服务表示。

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

trait OrderRepository {      
def search(filter:OrderFilter):Seq[Order]      
def findById(orderId:String):Order      
}

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

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

解决此问题的最合适选择是什么?

  1. OrderRepository添加新方法,例如def searchOrderDestinations(filter:DestinationFilter): Seq[Destination]
  2. 创建新存储库:
trait OrderDestinationRepository {
def searchOrderDestinations(filter:DestinationFilter): Seq[Destination]
}

应用程序服务也是如此 - 我需要创建新DestinationAppService吗?

这些选项是否适用?或者也许有一些更好的解决方案? 提前感谢!

这是一个 CQRS 读取模型

完美 - 创建和更新按目的地编制索引的订单列表,并使用它来提供查询结果。

想想"关系数据库,其中包括创建视图和索引所需的数据"。 查询转到数据库,该数据库充当信息的缓存。 运行后台进程(异步(以更新数据库中的信息。

运行该过程的频率取决于视图中数据的过时程度。 如果视图显示截至 10 分钟前的结果,对业务有多糟糕?截至 1 分钟前?一个小时前?

最新更新