2011-03-21 5 views
1

FileDependency와 함께 Microsoft EnterPrise 라이브러리 캐싱 라이브러리 (버전 5)를 사용하고 있습니다.FileDependency 파일을 변경 한 후 캐싱이 실패합니다.

내가 캐시하려는 클래스에서 캐시에서 항목을 반환하거나 정적 클래스에 새 클래스를 만들고 캐시에 추가 할 정적 속성이 있습니다.

이것은 처음에 잘 작동하며 클래스가 한 번 생성 된 후 캐시 된 사본이 반환됩니다. 그러나 종속성 파일이 변경되면 캐시 된 항목은 반환되지 않습니다.

다음은이 문제를 설명하기위한 샘플 프로그램입니다.

이의 출력은

999 cached , 1 uncached 
999 cached , 1001 uncached 

나는 결과가있을 것으로 예상 것입니다

999 cached , 1 uncached 
1998 cached , 2 uncached 

그것은 다시 캐시에 추가 된 객체 같을 것이다, 그러나 즉시 만료로 삭제 .

왜 그런가?

using System; 
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; 
using Microsoft.Practices.EnterpriseLibrary.Caching; 
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations; 

namespace TestCache 
{ 
    static class Program 
    { 
    [STAThread] 
    static void Main() 
    { 
     Cache.Create(); 

     for (int i = 0; i < 1000; i++) 
      TestClass.Current.DummyMethod(); 
     Console.WriteLine(String.Format("{0} cached , {1} uncached", TestClass.CachedItems, TestClass.UncachedItems)); 

     System.IO.File.AppendAllText(Cache.dependencyFileName, "Test"); 

     for (int i = 0; i < 1000; i++) 
      TestClass.Current.DummyMethod();   
     Console.WriteLine(String.Format("{0} cached , {1} uncached", TestClass.CachedItems, TestClass.UncachedItems)); 

     Console.ReadLine(); 
    } 
} 

public class Cache 
{ 
    public static CacheManager cacheManager = null; 
    public static string dependencyFileName; 
    public static FileDependency objFileDependency; 

    public static void Create() 
    { 
     var builder = new ConfigurationSourceBuilder(); 

     builder.ConfigureCaching() 
       .ForCacheManagerNamed("TestCache") 
       .UseAsDefaultCache() 
       .StoreInMemory(); 

     var configSource = new DictionaryConfigurationSource(); 
     builder.UpdateConfigurationWithReplace(configSource); 
     EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); 

     cacheManager = (CacheManager)EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>("TestCache"); 

     dependencyFileName = "testCache.xml"; 
     if (!System.IO.File.Exists(dependencyFileName)) 
      using (System.IO.File.Create(dependencyFileName)) { } 

     objFileDependency = new FileDependency(dependencyFileName); 
    } 
} 

public class TestClass 
{ 

    public static int CachedItems =0; 
    public static int UncachedItems = 0; 

    public void DummyMethod() 
    { 
    } 

    public static TestClass Current 
    { 
     get 
     { 
      TestClass current = (Cache.cacheManager.GetData("Test") as TestClass); 
      if (current != null) 
       CachedItems++; 
      else 
      { 
       UncachedItems++; 
       current = new TestClass(); 
       Cache.cacheManager.Add("Test", current, CacheItemPriority.Normal, null, new ICacheItemExpiration[] { Cache.objFileDependency }); 
      } 
      return current; 
     } 
    } 

} 

}

답변

1

문제는 정적 FileDependency을 사용하는 것입니다. 이로 인해 FileDependency의 LastUpdateTime은 업데이트되지 않으므로 캐시에 추가 된 모든 항목이 만료 된 것으로 표시됩니다 (HasExpired() == true). 항목이 만료되었으므로 캐시에 추가하더라도 검색 할 수는 없습니다.

해결 방법은 캐시에 모든 추가 작업에 새로운 FileDependency 개체를 사용하는 것입니다. 가장 쉬운 변경은 objFileDependency 필드를 속성으로 대체하는 것입니다. 기존 이름과 접근 방식을 사용하면 코드는 다음과 같습니다.

+0

정말 고마워요. – sgmoore

관련 문제