我正在学习ServiceStack,并对如何将[Route]标记用于缓存有疑问。这是我的代码:
[Route("/applicationusers")]
[Route("/applicationusers/{Id}")]
public class ApplicationUsers : IReturn<ApplicationUserResponse>
{
public int Id { get; set; }
}
public object Get(ApplicationUsers request)
{
//var cacheKey = UrnId.Create<ApplicationUsers>("users");
//return RequestContext.ToOptimizedResultUsingCache(base.Cache, cacheKey, () =>
return new ApplicationUserResponse
{
ApplicationUsers = (request.Id == 0)
? Db.Select<ApplicationUser>()
: Db.Select<ApplicationUser>("Id = {0}", request.Id)
};
}
我想要的是&#34; ApplicationUsers&#34;要缓存的集合,以及传入Id的时间,以便使用主缓存集合来获取单个对象。
如果我取消注释上面的代码,主要集合将缓存在&#34; users&#34;密钥,但我提交的任何特定查询再次点击Db。我只是在考虑缓存错误吗?
提前致谢, 麦克
答案 0 :(得分:2)
这一行
var cacheKey = UrnId.Create<ApplicationUsers>("users");
为所有请求创建相同的缓存键,您必须使用某些请求参数为每个不同的响应创建“唯一键”。
var cacheKey = UrnId.Create<ApplicationUsers>(request.Id.ToString());
这将为get all提供“urn:ApplicationUsers:0”键,为Id = 9的请求提供“urn:ApplicationUsers:9”
现在你可以用这种方式使用扩展方法。
return RequestContext.ToOptimizedResultUsingCache(Cache, cacheKey, () => {
if(request.Id == 0) return GetAll();
else return GetOne(request.Id);
});
我希望这会有所帮助,问候。