rockinthesixstring - да, вы можете добавить кеш http в этот слой, используя анонимную функцию для извлечения из репозитория или извлечения из кеша.в основном, вы бы делали это по следующим строкам (это из приложения, над которым я сейчас работаю, которое использует дозвуковое, но предпосылка того, что вам нужно, идентична.
/// <summary>
/// Returns an IQueryable based on the passed-in Expression Database
/// </summary>
IQueryable<T> IRepository<T>.Find(Expression<Func<T, bool>> expression)
{
// set up our object cacheKey
string keyValue = ParseExpression(expression);
if(keyValue==null)
{
return _repository.Find(expression);
}
string cacheKey = string.Format(EntityrootList, _className, "Find", keyValue, DateTime.UtcNow.Ticks.ToString(), string.Empty);
// try to populate from the cache
// rockinthesixstring - this is the part that is most relevant to you
var result = Cache.Get(cacheKey,
() => _repository.Find(expression),
CacheDuration);
return result;
}
[править] в контроллере, вы бы назвали это так (контроллер _repository установлен как:
readonly IRepository<Booking> _repository;
в примере):
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ContentResult ListBookings(int shareholderid)
{
Expression<Func<Booking, bool>> exprTree = x => x.FundShareholderEntity.ShareholderID == shareholderid;
var bookings = _repository.Find(exprTree).OrderByDescending(x => x.BookingDetailEntity.ActualDateFrom).OrderBy(x => x.BookingTypeID);
return Content(this.RenderPartialToString("BookingListNoPaging", bookings));
}
В приведенном выше примере Cache (т.е. Cache.Get ()) - это класс, который оборачивает кэш httpcontext более удобным для пользователя способом.
надеюсь, это поможет ...
jim
[править] - добавлен интерфейс кеша для добавления к «дебатам»:)
public interface ISessionCache
{
T Get<T>(string key);
T Get<T>(string key, Func<T> getUncachedItem, int cacheDuration);
void Insert(string key, object obj, int cacheDuration, CacheDependency arg0, TimeSpan arg2);
void Remove(string key);
object this[string key] { get; } // default indexer
IDictionaryEnumerator GetEnumerator();
}
в классе для инъекций будет использоваться следующим образом:
public class FakeCache : ISessionCache
{... all inteface members implemented here etc..}
или для httpcache:
public class HttpContextCache : ISessionCache
{... all inteface members implemented here etc..}
и т. Д. И т. Д. Еще раз ура - Джим