1

我正在学习 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)
    };
}

我想要的是缓存“ApplicationUsers”集合,以及我传入 Id 的时间,以便它使用主缓存集合来获取单个对象。

如果我取消注释上面的代码,主集合缓存在“用户”键下,但我提交的任何特定查询都会再次命中 Db。我只是在想缓存错误吗?

在此先感谢,迈克

4

1 回答 1

2

这条线

var cacheKey = UrnId.Create<ApplicationUsers>("users");

为所有请求创建相同的缓存键,您必须使用一些请求参数为每个不同的响应创建一个“唯一键”。

var cacheKey = UrnId.Create<ApplicationUsers>(request.Id.ToString());

这将为您提供获取全部的“urn:ApplicationUsers:0”键和用于 Id = 9 的请求的“urn:ApplicationUsers:9”

现在您可以通过这种方式使用扩展方法。

 return RequestContext.ToOptimizedResultUsingCache(Cache, cacheKey, () => {
                                                                               if(request.Id == 0) return GetAll();
                                                                               else return GetOne(request.Id);
                                                                           });

我希望这会有所帮助,问候。

于 2013-08-29T01:29:06.797 回答