C# 在Web API使用的域项目中实现服务缓存
我的问题是:如何在我的域项目中实现缓存,该项目的工作方式与存储库模式的正常堆栈类似 我的设置如下所示:C# 在Web API使用的域项目中实现服务缓存,c#,asp.net,asp.net-mvc,asp.net-mvc-4,caching,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Caching,我的问题是:如何在我的域项目中实现缓存,该项目的工作方式与存储库模式的正常堆栈类似 我的设置如下所示: ASP.NETMVC网站 Web API 域项目(使用IoC和Windsor) 例如,我的域项目有: IOrderRepository.cs OrderRepository.cs Order.cs 我的ASP.NETMVC网站调用WebAPI并返回一些DTO类。然后,我的Web API将这些对象映射到我的域项目中的业务对象,并使应用程序工作 我的应用程序中没有实现缓存 应该在哪里实现缓
- ASP.NETMVC网站
- Web API
- 域项目(使用IoC和Windsor)
- IOrderRepository.cs
- OrderRepository.cs
- Order.cs
Get
、GetBySpecification
和Update
方法必须调用OrderRepository注入的一些通用缓存处理程序
这显然给出了一些非常难看的代码,并且不是很通用
如何维护缓存?
假设我们有一个像“OrderRepostory_123”这样的缓存键。当我调用Update方法时,是否应该调用cacheHandler.Delete(“OrderRepository_123”)?因为那看起来也很难看
我自己的想法…
除了我所描述的一些混乱的方法之外,我真的看不到一个像样的方法来做这件事。也许我可以做一些缓存层,但我想这意味着我的WebAPI将不再调用我的OrderRepository,但我的CacheOrderRepository可以做些什么?可能有一百万种不同的方法可以做到这一点,但在我看来(考虑到缓存的目的是提高性能)实现类似于存储库模式的缓存-域对象与缓存(而不是数据库)交互,那么后台线程可能会保持数据库和缓存同步,应用程序池的初始启动将填充缓存(假设需要快速加载)。一系列的技术问题开始出现,比如如果缓存被修改的方式违反了数据库约束,该怎么办。代码维护成为一个关注点,其中任何与数据结构相关的关注点都可能需要在多个地方实现。并发性问题开始进入争论。只是一些想法…可能有一百万种不同的方法可以做到这一点,但在我看来(考虑到缓存的目的是提高性能),实现类似于存储库模式的缓存-其中域对象与缓存而不是数据库交互,然后,也许后台线程可以使数据库和缓存保持同步,应用程序池的初始启动将填充缓存(假设需要快速加载)。一系列的技术问题开始出现,比如如果缓存被修改的方式违反了数据库约束,该怎么办。代码维护成为一个关注点,其中任何与数据结构相关的关注点都可能需要在多个地方实现。并发性问题开始进入争论。只是一些想法…根据具体情况,有多个级别的缓存。但是,如果您正在寻找具有少量更改的通用集中式缓存,我认为您将寻找EF二级缓存,有关更多详细信息,请查看以下内容 您还可以在webapi级别使用缓存 请考虑,如果MVC和WebAPI被托管在2个不同的数据中心,那么MVC和WebAPI是否是网络流量?
<> P>和巨大的Read Access门户网站,您可以考虑ReiSIS
根据情况而有多个级别的缓存,但是如果您正在寻找通用的集中缓存,而更改的数量较少,那么我认为您将寻找EF二级缓存,并且更多细节检查下面的
您还可以在webapi级别使用缓存 请考虑,如果MVC和WebAPI被托管在2个不同的数据中心,那么MVC和WebAPI是否是网络流量?<> P>和巨大的Read Access门户,您可能会考虑ReiSIS < P>听起来好像您想使用.NET缓存机制,而不是像RIDIS或MEMCACHE那样的分布式缓存。我建议使用
System.Runtime.Caching.MemoryCache
类,而不是传统的System.Web.Caching.Cache
类。这样做可以独立于MVC/API层创建缓存层,因为MemoryCache对System.Web没有依赖关系
缓存DTO对象将大大加快应用程序的速度。这可以防止您必须等待数据从镜像数据层的缓存中组装。例如,请求Order123只需要一次缓存读取,而不是多次读取任何FK数据。当然,缓存层需要包含在执行更新时使缓存无效的逻辑。推荐的方法是检索缓存的order对象并直接修改其属性,然后异步持久化到DB 听起来您想使用.NET缓存机制,而不是像Redis或Memcache这样的分布式缓存。我建议使用
System.Runtime.Caching.MemoryCache
类,而不是传统的System.Web.Caching.Cache
类。这样做可以独立于MVC/API层创建缓存层,因为MemoryCache对System.Web没有依赖关系
缓存DTO对象将大大加快应用程序的速度。这可以防止您必须等待数据从镜像数据层的缓存中组装。例如,请求Order123只需要一次缓存读取,而不是多次读取任何FK数据。当然,缓存层需要包含在执行更新时使缓存无效的逻辑。记录