2013-08-30 143 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

相關問題