2013-08-24 3 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» коллекции для кэширования, и времена, когда я прохожу в Id, для того, чтобы использовать основную коллекцию кешированной, чтобы получить отдельный объект вне.

Если я раскомментирую код выше, основная коллекция кэшируется под ключом «пользователи», но любой конкретный запрос, который я отправляю, снова попадает в Db. Я просто думаю о кеше неправильно?

Спасибо заранее, Майк

ответ

2

эта линия

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

создает тот же ключ кэша для всех запросов, вы должны использовать некоторые из параметров запроса, чтобы сделать «уникальный ключ «за каждый ответ.

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

это даст вам «урну: ApplicationUsers: 0» ключ для получить все и «урна: ApplicationUsers: 9» для запроса с Id = 9

теперь вы можете использовать расширение метод таким образом.

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

Надеюсь, это поможет, приветствует.

+0

Правильно, если я поместил уникальное значение в cacheKey, он будет кэшировать вещи по отдельности. Но этого я не хочу. Я хочу кэшировать «Все», и отдельные запросы используют кэшированную коллекцию «Все». – MikeB

+0

В этом случае сохраните свой статический кеш-ключ и фильтр после использования «ToOptimizedResultUsingCache» с помощью LINQ 'var result = RequestContext.ToOptimizedResultUsingCache (Cache, cacheKey,() => GetAll()); if (request.Id == 0) результат возврата; else return result.FirstOrDefault (item => item.Id == request.Id); ' – rudygt

+0

Я пробовал это, единственная проблема заключается в том, что« ToOptimizedResultUsingCache »возвращает объект, и я не могу отнести его на свой конкретный тип. К тому времени, как я дошел до этого момента, я начал думать, что, возможно, я не использую кеширование, как это было разработано ... – MikeB

Смежные вопросы