Domain driven design DDD聚合存储库和缓存存储库

Domain driven design DDD聚合存储库和缓存存储库,domain-driven-design,Domain Driven Design,我有产品存储库。我想使用redis作为缓存。我创建了缓存repo 当我想要得到产品的时候。首先,我去缓存repo,如果不存在,我查询主数据库。如果里面有产品。我写入缓存并返回 选项1)我通过DI在产品存储库中获取缓存存储库并在其中使用 选项2)我在command handler with product repository中的应用层中获得缓存存储库,并分别使用这两种存储库。在我看来,您是受技术需求(即Redis的使用)而不是业务需求(即为什么需要缓存?性能问题、延迟?)驱动的 但是,要总结SO

我有产品存储库。我想使用redis作为缓存。我创建了缓存repo

当我想要得到产品的时候。首先,我去缓存repo,如果不存在,我查询主数据库。如果里面有产品。我写入缓存并返回

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


选项2)我在command handler with product repository中的应用层中获得缓存存储库,并分别使用这两种存储库。在我看来,您是受技术需求(即Redis的使用)而不是业务需求(即为什么需要缓存?性能问题、延迟?)驱动的

但是,要总结SO中另一个帖子的精彩帖子,您可以选择以下选项:

  • 直接在应用程序服务中管理应用程序层中的缓存。这样,您就可以完全控制是否要将缓存用于此类查询/命令
  • 在存储库中隐藏缓存。但在这里,存储库的每个客户端都将使用缓存,这可能是您想要控制的

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

使用decorator模式用缓存存储库装饰产品存储库。检查缓存回购中是否存在产品,如果不存在,则使用装饰(即产品回购)获取产品。S和O从坚实的原则得到满足。