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 を渡すときに、メインのキャッシュされたコレクションを使用して個々のオブジェクトを取得することです。

上記のコードのコメントを外すと、メイン コレクションは "users" キーの下にキャッシュされますが、送信した特定のクエリは Db に再度ヒットします。キャッシュが間違っていると考えているだけですか?

前もって感謝します、マイク

4

1 に答える 1

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);
                                                                           });

これがお役に立てば幸いです。

于 2013-08-29T01:29:06.797 に答える