使用缓存与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 { ... }
});
}
从object
到ResponseDto
返回类型更改在功能上等同,并且具有没有行为差异。
,因为它没有影响我的服务几乎总是有一个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 { ... }
}
凡后续调用将返回缓存的响应,而不是打电话给你服务。
CacheResponseAttribute的工作原理是全自动的吗?不需要缓存键或其他任何东西?将响应类型更改为'object'的问题是,它会打破我的单元测试,这些测试都直接调用service.Get方法。 – mat
@mat是它默认使用'RawUrl'作为缓存键。 [Advanced CacheInfo Customization](http://docs.servicestack.net/cacheresponse-attribute#advanced-cacheinfo-customization)显示了一个如何使用自定义密钥的示例。 – mythz
ChacheResponseAttribute与会话无关,我假设。我在问,因为我可能不得不抛出一个错误,这取决于哪个用户试图访问路由,并且该检查不应该被缓存绕过。 – mat