Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Web API使用的域项目中实现服务缓存_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Caching - Fatal编程技术网

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
我的ASP.NETMVC网站调用WebAPI并返回一些DTO类。然后,我的Web API将这些对象映射到我的域项目中的业务对象,并使应用程序工作

我的应用程序中没有实现缓存

应该在哪里实现缓存?

我考虑在OrderRepository中的方法中执行此操作,因此我的
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数据。当然,缓存层需要包含在执行更新时使缓存无效的逻辑。记录