Caching 存储库模式-缓存

Caching 存储库模式-缓存,caching,repository-pattern,Caching,Repository Pattern,我不确定在我的存储库模式中应该在哪里实现缓存 我应该在服务逻辑中还是在存储库中实现它 GUI->BusinessLogic(服务)->DataAccess(存储库) 我会在存储库/数据访问层处理它。原因是,从何处获取数据并不取决于业务层,而这是存储库的工作。然后,存储库将根据数据访问逻辑的情况决定从何处获取数据、缓存(如果不是太旧)或从实时数据源获取数据 与其说是业务逻辑问题,还不如说是数据访问问题 最好不要将缓存逻辑直接放入存储库,因为这违反了单一责任原则(SRP)和关注点分离。SRP本质上说

我不确定在我的存储库模式中应该在哪里实现缓存

我应该在服务逻辑中还是在存储库中实现它

GUI->BusinessLogic(服务)->DataAccess(存储库)


我会在存储库/数据访问层处理它。原因是,从何处获取数据并不取决于业务层,而这是存储库的工作。然后,存储库将根据数据访问逻辑的情况决定从何处获取数据、缓存(如果不是太旧)或从实时数据源获取数据


与其说是业务逻辑问题,还不如说是数据访问问题

最好不要将缓存逻辑直接放入存储库,因为这违反了单一责任原则(SRP)和关注点分离。SRP本质上说,您的类应该只有一个更改的理由。如果您将数据访问和缓存策略的关注点合并到同一个类中,那么如果其中任何一个需要更改,您将需要接触该类。您还可能会发现您违反了DRY原则,因为缓存逻辑很容易分散在许多不同的存储库方法中,如果其中任何一种方法需要更改,您最终不得不更改许多方法

更好的方法是使用代理或策略模式以单独的类型应用缓存逻辑,例如CachedRepository,然后在缓存为空时根据需要使用实际的以数据库为中心的存储库。我已经写了两篇文章,演示了如何使用.NET/C#实现此功能,您可以在我的博客上找到这篇文章,如下所示:

如果您喜欢视频,我还将在Pluralsight上的代理设计模式中描述该模式,如下所示:


谢谢你的回答!我认为实现延迟加载也更好。首先,这是一个性能问题,这就是为什么我们通常使用缓存,不是吗?缓存业务层更有效,因为您可以避免每次我同意您的方法时都重新执行业务逻辑。遗留业务逻辑类继续使用非缓存存储库,新的业务逻辑服务可以使用新的存储库。SRP应用于类时,对现有逻辑的影响较小。您可以在存储库模式中实现缓存,而无需在单个存储库中完成所有操作class@Hilikus是的,如果您遵循此处描述的方法。这就是重点。:)如果您将缓存的责任添加到已经负责持久性的存储库类中,那么这不仅仅是一个责任。@ssmith我认为您对开放/封闭原则和SRP的理解非常狭隘。编辑现有类并不是坏事,事实上,它应该是为了重构、提高性能、更新新API的内部依赖关系等目的而进行的。应该关闭一个类进行修改,以改变其公开的API,并打开该类进行API扩展,以满足按需需求,但仍在原始API的范围内。这与SRP的想法相同,只要您公开的API没有改变,您就可以并且应该出于上述原因编辑代码,就像在本例中一样,以提高性能。@ssmith关于CachedReplicatory的内容。通常有2个选项:1)使用一个缓存对象,该对象公开API以从本地存储检索/保存到本地存储。2) 在CachedRepository中写入缓存逻辑。现在,如果您选择选项2并公开一个缓存API,那么这是不好的,因为这样的API与存储库的逻辑域不一致。如果选择选项2而不公开缓存API或选项1,那么创建另一个类是毫无意义的,只需编辑原始类以使用策略模式即可。代理模式在这里也很糟糕,因为用户在使用IT时不应该考虑任何副作用。