使用缓存与ServiceStack

问题描述:

一个强类型的服务实现,我有我的服务定义,它通过IReturn接口使用强类型返回的DTO使用缓存与ServiceStack

[Route ("/items/{id}", "GET")] 
public class FindItems : IReturn<FindItemResponse> 
{ 
    public int Id { get; set; } 
} 

public class FindItemResponse { ... } 

我也使用这种类型我服务的实现

public FindItemResponse Get (FindItems request) 
{ 
    ... 
} 

这工作得很好,直到我尝试使用ServiceStack的缓存功能。根据the documentation,应该使用Request.ToOptimizedResultUsingCache? method, which returns object and not FindItemResponse. I checked the actual return type, sometimes its a JSON string, sometimes its a ServiceStack.CompressedResult`,所以没有机会手动转换它。

当您使用强类型响应(如@mythz推荐)时,缓存应该如何在ServiceStack中完成?

ToOptimizedResultUsingCache在随后的调用中返回CompressedResult,因为它返回请求的格式(例如json)的缓存压缩字节()。

这应该是您的客户端的透明实现细节,它只接收服务的缓存版本。当使用ToOptimizedResult*的API的服务需求能够返回缓存的响应,因此您需要返回类型更改为object,如:

public object Get(FindItems request) 
{ 
    return Request.ToOptimizedResultUsingCache(base.Cache,cacheKey,()=> 
    { 
     return new FindItemResponse { ... } 
    });   
} 

objectResponseDto返回类型更改在功能上等同,并且具有没有行为差异。

,因为它没有影响我的服务几乎总是有一个object返回类型,除非我需要使用base.ResolveService<T>其他服务内部调用它,它可以指定在IReturn<T>接口标记的响应类型,例如更重要

public class FindItems : IReturn<FindItemResponse> {} 

这将启用.NET客户端将能够利用的简洁类型的API。

使用ToOptimizedResult* API的另一种方法是使用较新的[CacheResponse] Attribute这将让你的服务返回一个类型化的响应DTO,如:

[CacheResponse(Duration = 60)] 
public FindItemResponse Get(FindItems request) 
{ 
    return new FindItemResponse { ... } 
} 

凡后续调用将返回缓存的响应,而不是打电话给你服务。

+0

CacheResponseAttribute的工作原理是全自动的吗?不需要缓存键或其他任何东西?将响应类型更改为'object'的问题是,它会打破我的单元测试,这些测试都直接调用service.Get方法。 – mat

+0

@mat是它默认使用'RawUrl'作为缓存键。 [Advanced CacheInfo Customization](http://docs.servicestack.net/cacheresponse-attribute#advanced-cacheinfo-customization)显示了一个如何使用自定义密钥的示例。 – mythz

+0

ChacheResponseAttribute与会话无关,我假设。我在问,因为我可能不得不抛出一个错误,这取决于哪个用户试图访问路由,并且该检查不应该被缓存绕过。 – mat