2009-02-04 2 views
3

나는 우리 데이터베이스에서 문자열을 반환하는 사용자 지정 리소스 공급자를 만들었습니다.ResourceProviderFlory 정기적 새로 고침

문제는이 항목의 캐시를 "파열"하고 데이터베이스에서 다시로드하는 방법을 찾지 못했기 때문입니다. 이상적으로는 매 x 분마다 또는 수동으로 캐시를 업데이트하고 다시로드하려는 경우이 작업을 수동으로 수행합니다.

기술적으로 쉽습니다. 나는 해시 테이블에 모든 것을 저장하고 있기 때문에 핵폭탄을 필요에 따라 재 장전한다. 그러나 ResourceProviderFactory가 각 리소스 클래스의로드를 처리하고 생성 한 클래스를 열거하는 방법을 모르겠습니다.

코드의 개요 :

public class ResourceProvider : IResourceProvider 
{ 

    private Dictionary<string, Dictionary<string, object>> _resourceCache 
     = new Dictionary<string, Dictionary<string, object>>(); 

    private string _virtualPath; 
    private string _className; 

    public ResourceProvider(string virtualPath, string className) 
    { 
     _virtualPath = virtualPath; 
     _className = className; 
    } 

    public object GetObject(string resourceKey, CultureInfo culture) 
    { 
     ... 
    } 
} 


public class ResourceProviderFactory :System.Web.Compilation.ResourceProviderFactory 
{ 
    public override IResourceProvider CreateGlobalResourceProvider(string classKey) 
    { 
     return new Cannla.Business.Resource.ResourceProvider(string.Empty, classKey); 
    } 
     ... 
     ... 
} 

은 내가 무엇을 계획 한 것은 예를 들어 컬렉션에 새 개체를 추가 한 다음 그 내용을 열거하고 그 내부의 모든 핵무기 (마다 CreateGlobalResourceProvider가 호출되는 참조를 추가했다 개체가 필요한 경우)하지만 ResourceProviderFactory에 이상한 일이 발생하는지 확신 할 수 없습니다.

ResourceProviderFactory IEnumerable 메서드 또는이 코드를 모두 빌드하기 전에 모든 개체를 쉽게 얻을 수있는 방법이 있습니까?

답변

1

ASP.Net 캐시 시스템을 사용할 수있는 경우 그냥 사용하십시오. 당신은 HttpRuntime.Cache을 사용하여 액세스 시간 제한 무효화 아래의 예를 확인 추가 할 수 있습니다 : 당신은 당신은 캐시 무효화를 트리거 로직을 넣을 수 있습니다 ASP.Net 캐시 시스템

을 사용할 수없는 경우

var Key = "Resources:" + ResourceType + ResourceKey + Cutlure.Name; 
HttpRuntime.Cache.Insert(Key, ValueToCache, 
    null, DateTime.Now.AddMinutes(1d), 
    System.Web.Caching.Cache.NoSlidingExpiration); 

을 IResourceProvider 내부 예. 캐시가 만료되면 GetObject를 체크하십시오.

+0

타이밍이 문제가 아니며 생성 된 각 개체에 대한 참조를 얻는 방법을 찾고있었습니다. 그러나 아이디어에 감사드립니다. – mjallday