我有我的服务定义,它通过IReturn接口使用强类型返回DTO
[Route ("/items/{id}", "GET")]
public class FindItems : IReturn<FindItemResponse>
{
public int Id { get; set; }
}
public class FindItemResponse { ... }
我也将该类型与我的服务实现一起使用
public FindItemResponse Get (FindItems request)
{
...
}
这非常有效,直到我尝试使用ServiceStack的缓存功能。根据{{3}},应该使用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中完成缓存?
答案 0 :(得分:2)
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>
从其他服务内部调用它,更重要的是在{{中指定响应类型1}}界面标记,例如:
IReturn<T>
这将启用.NET客户端将能够利用的简洁类型API。
使用public class FindItems : IReturn<FindItemResponse> {}
API的替代方法是使用较新的[CacheResponse] Attribute,这将使您的服务返回类型化响应DTO,例如:
ToOptimizedResult*
后续调用的位置将返回缓存的响应,而不是调用您的服务。