我的问题是:我如何在我的域项目中实现缓存,它的工作方式就像一个使用存储库模式的普通堆栈。
我的设置如下所示:
- ASP.NET MVC 网站
- 网络应用程序接口(interface)
- 领域项目(使用 IoC,使用 Windsor)
例如我的领域项目有:
- IOrderRepository.cs
- OrderRepository.cs
- Order.cs
我的 ASP.NET MVC 网站调用 Web API 并取回一些 DTO 类。然后,我的 Web API 将这些对象映射到我的域项目中的业务对象,并使应用程序运行。
我的应用程序中没有任何地方实现缓存。
应该在哪里实现缓存?
我考虑过在 OrderRepository 的方法中执行它,所以我的 Get、GetBySpecification 和 Update 方法必须调用一些通用缓存由 OrderRepository 注入(inject)的处理程序。
这显然给出了一些非常难看的代码,而且不是很通用。
如何维护缓存?
假设我们有一个像“OrderRepostory_123”这样的缓存键。当我调用 Update 方法时,我应该调用 cacheHandler.Delete("OrderRepository_123") 吗?因为那看起来也很丑
我自己的想法...
除了我所描述的一些困惑的方法之外,我真的看不到一个合适的方法来做到这一点。也许我可以做一些缓存层,但我想这意味着我的 WebAPI 不会再调用我的 OrderRepository,而是我的 CacheOrderRepository 之类的东西?
请您参考如下方法:
就个人而言,我不喜欢直接在存储库类中包含缓存。一个类应该有一个改变的原因,而添加缓存通常会增加第二个原因。鉴于您的出发点,您至少有两个可能的合理选择:
- 创建一个新类,将缓存添加到存储库并公开相同的接口(interface)
- 创建一个使用一个或多个存储库并添加缓存的新服务接口(interface)
根据我的经验,#2 通常更有值(value),因为您希望作为单个单元缓存的对象可能会跨存储库。当然,这取决于您如何确定存储库的范围。很大程度上取决于您的存储库是基于聚合根(ala DDD)、表还是其他。
