2013-08-30 96 views
2

我的缓存符合我的要求,但我希望能够判断我返回的返回是否实际上来自缓存。有没有办法看到这个?我可以访问代码库进行修改。ServiceStack:如何判断请求的返回是否被缓存?

ServiceStack的标准缓存模式:

public class OrdersService : Service 
{ 
    public object Get(CachedOrders request) 
    { 
     var cacheKey = "unique_key_for_this_request"; 
     return base.RequestContext.ToOptimizedResultUsingCache(base.Cache,cacheKey,()=> 
      { 
       //Delegate is executed if item doesn't exist in cache 
       //Any response DTO returned here will be cached automatically 
      }); 
    } 
} 
+0

你可以显示缓存代码吗? – paqogomez

回答

3

正如您的意见传递给ToOptimizedResultUsingCache方法的委托,如果该项目不存在于缓存中时,才会执行提及。我只需将“缓存在”属性添加到响应DTO并将其设置在该代理中。

public class OrdersService : Service 
{ 
    public object Get(CachedOrders request) 
    { 
     var cacheKey = "unique_key_for_this_request"; 
     var returnDto = base.RequestContext.ToOptimizedResultUsingCache(base.Cache,cacheKey,() => { 
      return new MyReturnDto { 
       CachedAt = DateTime.Now 
      };     
     }); 
    } 
} 

然后,您可以使用CachedAt属性时看到该项目被缓存。

如果你不想修改你的DTO,你可以在缓存结果时调用一个委托范围以外的变量。

public class OrdersService : Service 
{ 
    public object Get(CachedOrders request) 
    { 
     var cacheKey = "unique_key_for_this_request"; 
     var isCached = false; 
     var returnDto = base.RequestContext.ToOptimizedResultUsingCache(base.Cache,cacheKey,() => { 
      isCached = true;    
     }); 
     // Do something if it was cached... 
    } 
} 
+0

我很确定我已经读过(从神话中)向DTO添加非业务相关数据,这在ServiceStack中打败了服务的核心实践。并且将CachedAt属性添加到所有业务对象中并不是我想要做的事情。 我宁愿如果只是有一些方法来检测从我的AppHost或ServiceStack运行时,以查看是否从缓存响应。 – mariocatch

+0

你最近的编辑是个好主意。当缓存返回时,可以将一个键/值对添加到base.Request.Items集合。然后从我的AppHost中,我可以从Items集合中查找关键字并在那里执行我的逻辑。 – mariocatch

相关问题