【发布时间】:2020-03-16 18:51:58
【问题描述】:
我不确定应该在我的存储库模式中的何处实现缓存。
我应该在服务逻辑还是在存储库中实现它?
GUI -> BusinessLogic(服务)-> DataAccess(存储库)
【问题讨论】:
标签: caching repository-pattern
我不确定应该在我的存储库模式中的何处实现缓存。
我应该在服务逻辑还是在存储库中实现它?
GUI -> BusinessLogic(服务)-> DataAccess(存储库)
【问题讨论】:
标签: caching repository-pattern
最好不要将缓存逻辑直接放入存储库,因为这违反了单一职责原则 (SRP) 和关注点分离。 SRP 本质上是说你的类应该只有一个改变的理由。如果您将数据访问和缓存策略的关注点放在同一个类中,那么如果其中任何一个需要更改,您就需要接触该类。您可能还会发现您违反了 DRY 原则,因为很容易将缓存逻辑分布在许多不同的存储库方法中,如果其中任何一个需要更改,您最终不得不更改许多方法。
更好的方法是使用代理或策略模式在单独的类型中应用缓存逻辑,例如 CachedRepository,然后在缓存为空时根据需要使用实际的以 db 为中心的存储库。我已经写了两篇文章来演示如何使用 .NET/C# 来实现这一点,您可以在我的博客上找到这些文章:
如果您更喜欢视频,我还会在 Pluralsight 上的代理设计模式中描述该模式,此处:
【讨论】:
我会在存储库/数据访问层处理它。原因在于,从何处获取数据不取决于业务层,这是存储库的工作。然后,存储库将根据数据访问逻辑的情况决定从哪里获取数据、缓存(如果不是太旧)或从实时数据源获取数据。
这是一个数据访问问题,而不是业务逻辑问题。
【讨论】: