2

在 MVC 和我尝试过的大多数其他服务框架中,缓存是通过属性/过滤器完成的,无论是在控制器/动作或请求上,并且可以通过配置文件中的缓存配置文件进行控制。它似乎提供了更大的灵活性,也让核心服务代码更干净。

但是 ServiceStack 将它包含在服务中。这样做有什么理由吗?

我可以添加一个 CacheFilterAttribute,而是委托给服务吗?

 ToOptimizedResultUsingCache(base.Cache,cacheKey,()=>   {
     // Delegate to Request/Service being decorated?
 });

我四处寻找,但找不到答案。当然,它可能不会有太大的不同,因为通过委托方法缓存的 ServiceStack 非常干净。而且您很少在现实世界中即时更改缓存策略。所以这主要是出于好奇。谢谢。

4

1 回答 1

2

因为缓存模式涉及,首先检查它是否被缓存,如果没有则执行服务,填充缓存,然后返回结果。

请求过滤器不允许您执行服务,而响应过滤器意味着服务将始终执行(即减少缓存的有用性),因此替代方案将需要请求 + 响应过滤器组合,其中逻辑将被拆分分成2个不连贯的部分。将它放在服务中,可以让您查看和推理它是如何工作的以及到底发生了什么,它还允许完全访问以计算所使用的 uniqueHashKey 以及确切的内容和时间(或什至)缓存,这更难控制使用通用的黑盒缓存解决方案。

尽管我们对“烘焙”内置通用缓存解决方案持开放态度(通过属性或 ServiceRunner / 基类)。如果您想查看此功能,请添加一个功能请求,指定首选功能/用例(例如,基于时间/有效性的缓存/针对用户定义的聚合根/等的缓存)。

于 2013-10-13T19:11:08.467 回答