Caching 使用ServiceStack+进行缓存;Redis:如何不返回System.Object,而是返回DTO?
在我看到的所有示例中,ServiceStack方法中的缓存必须具有System.Object的返回类型。是否有更新/更新的文档允许返回正常的DTO 例如,如果这个Get方法不返回“object”(从ServiceStack文档中提取)就更好了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
我使用这个扩展,但是您会丢失基于请求上下文的优化。(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; }
}
}