我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
似乎不是一个好的解决方案。
解决此问题的最合适选择是什么?
:- 在
OrderRepository
添加新方法,例如def searchOrderDestinations(filter:DestinationFilter): Seq[Destination]
- 创建新存储库:
trait OrderDestinationRepository {
def searchOrderDestinations(filter:DestinationFilter): Seq[Destination]
}
应用程序服务也是如此 - 我需要创建新DestinationAppService
吗?
这些选项是否适用?或者也许有一些更好的解决方案? 提前感谢!
这是一个 CQRS 读取模型
完美 - 创建和更新按目的地编制索引的订单列表,并使用它来提供查询结果。
想想"关系数据库,其中包括创建视图和索引所需的数据"。 查询转到数据库,该数据库充当信息的缓存。 运行后台进程(异步(以更新数据库中的信息。
运行该过程的频率取决于视图中数据的过时程度。 如果视图显示截至 10 分钟前的结果,对业务有多糟糕?截至 1 分钟前?一个小时前?