DDD聚合仓库和缓存仓库

DDD aggregate repository and caching repository

我有产品库。我想使用 redis 作为缓存。然后我创建缓存回购。

当我想获得产品时。首先我去缓存回购如果不存在我查询主数据库。如果产品存在于那里。我写入缓存和 return.

选项 1) 我通过 DI 在产品存储库中获取缓存存储库并在其中使用。

选项 2) 我在带有产品存储库的命令处理程序中的应用程序层中获取缓存存储库,我分别使用两者

在我看来,您是由技术需求(即 Redis 的使用)而非业务需求(即为什么需要缓存?性能问题、延迟?)驱动的。

但是,要从 SO 中的另一个线程总结一个很棒的 post:Which layer should I implement caching of lookup data from database in a DDD application?,您有以下选择:

  • 在Application层管理缓存,直接在Application Service中。这样,您可以完全控制是否要为此类 query/command
  • 使用缓存
  • 隐藏存储库中的缓存。但是在这里,您存储库的每个客户端都将使用缓存,这可能是您想要控制的。

无论哪种方式,最常见的方法之一是使用模式 proxy,其中方法调用将首先被代理拦截,代理的作用是从其发送数据缓存,如果它已经有数据。否则将调用委托给原始对象。