在我尝试的MVC和大多数其他服务框架中,缓存是通过属性/过滤器完成的,可以是控制器/操作或请求,也可以通过配置文件中的缓存配置文件来控制。它似乎提供了更大的灵活性,也使核心服务代码更加清晰。
但ServiceStack在服务中有它。它有什么理由这样做吗?
我可以添加CacheFilterAttribute,但是代替服务吗?
ToOptimizedResultUsingCache(base.Cache,cacheKey,()=> {
// Delegate to Request/Service being decorated?
});
我四处搜寻但无法找到答案。当然,它可能不会产生很大的不同,因为通过委托方法的ServiceStack缓存非常干净。而且你很少在现实世界中动态改变缓存策略。所以这主要是出于好奇。感谢。
答案 0 :(得分:2)
因为缓存模式涉及,首先检查它是否被缓存,如果不是,然后执行服务,填充缓存,然后返回结果。
请求过滤器不允许您执行服务,响应过滤器意味着服务将始终执行(即减轻缓存的有用性),因此替代方案需要请求+响应过滤器组合,其中逻辑会分成两个脱节的部分。将它放在服务中,让你看到并推断它是如何工作的以及究竟发生了什么,它还允许完全访问来计算所使用的uniqueHashKey以及确切地知道何时以及何时(甚至是否)缓存,这是更难控制的使用通用的黑盒缓存解决方案。
虽然我们对'烘焙'内置通用缓存解决方案持开放态度(通过属性或ServiceRunner / base类)。 Add a feature request如果您想看到这一点,请指定首选功能/用例(例如,基于时间/有效性/缓存的缓存与用户定义的聚合根/等)。