그래서 ASP.NET MVC 응용 프로그램에서 viewmodel 당 일반/사용자 바운드 캐시 컨텍스트를 얻으려면 System.Runtime MemoryCache 주위에 몇 가지 래퍼 메소드를 작성했습니다.Memorycache는 내 객체를 저장하지 않습니다.
어떤 점에서 나는 명백한 이유없이 내 저장된 객체를 검색하는 대신 내 대의원이 매번 호출되는 것을 보았습니다.
이상하게도 (간단한 데이터를 사용하여 검사하는) 단위 테스트가 실패했거나 설명하는 패턴이 보이지 않았습니다.
여기에 래퍼 방법 중 하나입니다 : 누군가가 여기에 MemoryCache 내에서 스토리지에 대한 잘못된 개체를 렌더링 조건에 대해 알고있는 경우
public T GetCustom<T>(CacheItemPolicy cacheSettings, Func<T> createCallback, params object[] parameters)
{
if (parameters.Length == 0)
throw new ArgumentException("GetCustom can't be called without any parameters.");
lock (_threadLock)
{
var mergedToken = GetCacheSignature(parameters);
var cache = GetMemoryCache();
if (cache.Contains(mergedToken))
{
var cacheResult = cache.Get(mergedToken);
if (cacheResult is T)
return (T)cacheResult;
throw new ArgumentException(string.Format("A caching signature was passed, which duplicates another signature of different return type. ({0})", mergedToken));
}
var result = createCallback(); <!-- keeps landing here
if (!EqualityComparer<T>.Default.Equals(result, default(T)))
{
cache.Add(mergedToken, result, cacheSettings);
}
return result;
}
}
가 궁금했다.
그때까지는 저장소가 작동 할 때까지 복잡한 클래스의 속성을 제거 할 것입니다.
그럼에도 불구하고 경험은 흥미로울 것입니다.
@Andreas Experience - 생성자에서 고정 된 만료 날짜 시간을 설정하여 모든 단위 테스트를 통과 한 다음 제작 과정에서 날짜가 지난 후에 아무것도 캐시 할 수 없게되었습니다. 비슷한 소리. 체크 캐시 설정은 모든 cache.Add() 호출에 합당한 (그리고 미래의) 만료 날짜를 제공합니다. – Kaido
@AlexeiLevenkov ASP.NET MVC 5.2 – Dbl
@Kaido 문제의 메서드는 DateTimeOffset.Now.AddMinutes (5)를 절대 만료 날짜로 전달합니다. 항상 날짜. 그래서 그렇게해서는 안됩니다. 감사합니다. 어쨌든 – Dbl