在ServiceStack

时间:2017-06-13 10:08:49

标签: c# asp.net .net caching servicestack

我有我的服务定义,它通过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中完成缓存?

1 个答案:

答案 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*

后续调用的位置将返回缓存的响应,而不是调用您的服务。