2013-08-24 2 views
1

ServiceStack을 배우고 캐싱에 [Route] 태그를 사용하는 방법에 대해 질문이 있습니다. 내가 아이디를 전달할 때 개별 개체를 얻을 수있는 주요 캐시 모음을 사용할 수 있도록,ServiceStack 캐싱 전략

[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"수집하고, 시간 : 여기에 내 코드입니다.

위 코드의 주석 처리를 제거하면 주 컬렉션이 "users"키 아래에 캐시되지만 제출 한 특정 쿼리는 다시 Db에 도달합니다. 나는 캐시에 대해 잘못 생각하고 있는가? 사전에

감사합니다, 마이크

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

는 모든 요청에 ​​대해 동일한 캐시 키를 생성되고이 선, 당신은 "고유 키를 만들기 위해 요청 매개 변수 중 일부를 사용합니다

답변

2

"각각의 응답마다.

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

이 당신에게 "항아리 : ApplicationUsers : 0"줄 것이다 키 모두를 얻고는 "항아리 : ApplicationUsers : 9"= 9

지금 당신이 확장 기능을 사용할 수 있습니다 ID로 요청을 메서드를 호출합니다.

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

나는 이것이 도움이되기를 바랍니다.

+0

오른쪽. cacheKey에 고유 한 값을 입력하면 개별적으로 캐시됩니다. 그러나 그것은 내가 원하는 것이 아닙니다. 나는 "All"을 캐시하고 개별 요청에 캐시 된 "All"컬렉션을 사용하고 싶습니다. – MikeB

+0

그런 경우 LINQ'var result = RequestContext.ToOptimizedResultUsingCache (Cache, cacheKey,() => GetAll())와 함께 "ToOptimizedResultUsingCache"를 사용한 후에 정적 캐시 키와 필터를 유지하십시오. if (request.Id == 0) 반환 결과; else return result.FirstOrDefault (item => item.Id == request.Id); – rudygt

+0

"ToOptimizedResultUsingCache"가 개체를 반환하고 콘크리트로 캐스팅 할 수 없다는 문제가있었습니다. 유형. 이 시점에 이르러서는 아마도 설계된대로 캐싱을 사용하지 않을 것이라고 생각하기 시작했습니다. – MikeB