servicestack,Caching,Redis,servicestack" /> servicestack,Caching,Redis,servicestack" />

Caching 使用ServiceStack+进行缓存;Redis:如何不返回System.Object,而是返回DTO?

Caching 使用ServiceStack+进行缓存;Redis:如何不返回System.Object,而是返回DTO?,caching,redis,servicestack,Caching,Redis,servicestack,在我看到的所有示例中,ServiceStack方法中的缓存必须具有System.Object的返回类型。是否有更新/更新的文档允许返回正常的DTO 例如,如果这个Get方法不返回“object”(从ServiceStack文档中提取)就更好了 我使用这个扩展,但是您会丢失基于请求上下文的优化。(json、压缩等) public静态类ICacheClientExtensions { 公共静态T ToResultUsingCache(此ICacheClient缓存,字符串cacheKey,Func

在我看到的所有示例中,ServiceStack方法中的缓存必须具有System.Object的返回类型。是否有更新/更新的文档允许返回正常的DTO

例如,如果这个Get方法不返回“object”(从ServiceStack文档中提取)就更好了


我使用这个扩展,但是您会丢失基于请求上下文的优化。(json、压缩等)

public静态类ICacheClientExtensions
{
公共静态T ToResultUsingCache(此ICacheClient缓存,字符串cacheKey,Func fn,int hours=1),其中T:class
{
var cacheResult=cache.Get(cacheKey);
if(cacheResult!=null)
{
返回缓存结果;
}
var result=fn();
if(result==null)返回null;
cache.Set(cacheKey,result,TimeSpan.FromHours(hours));
返回结果;
} 
}
公共类MyService:Service
{
公共数据获取(GetData请求)
{
var key=UrnId.Create(request.Id);
Func fn=()=>Db.GetData(request.Id);
返回Cache.ToResultUsingCache(key,fn);
}
[路由(“/data/{id}”)]
公共类GetData:IReturn
{
公共int Id{get;set;}
}
}

此时返回DTO会给您带来什么好处?它会更加明确,并且与其他服务方法返回的具体类型保持一致。这很公平——我认为这不值得,因为返回类型是由CachedOrders类型实现的IReturn接口指定的。将其保留为对象可以提供更大的灵活性,例如,如果您想返回HttpError。
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
            });
    }
}
public static class ICacheClientExtensions
{
    public static T ToResultUsingCache<T>(this ICacheClient cache, string cacheKey, Func<T> fn, int hours = 1) where T : class
    {
        var cacheResult = cache.Get<T>(cacheKey);
        if (cacheResult != null)
        {
            return cacheResult;
        }
        var result = fn();
        if (result == null) return null;
        cache.Set(cacheKey, result, TimeSpan.FromHours(hours));
        return result;
    } 
}

public class MyService : Service
{
    public Data Get(GetData request)
    {
        var key = UrnId.Create<Data>(request.Id);

        Func<Data> fn = () => Db.GetData(request.Id);

        return Cache.ToResultUsingCache(key, fn);
    }

    [Route("/data/{id}")]
    public class GetData: IReturn<Data>
    {
        public int Id{ get; set; }
    }
}