ASP.NET 응용 프로그램에서 사용할 클래스 라이브러리에서 캐시 구현
-
03-07-2019 - |
문제
ASP.NET 응용 프로그램에서 사용하는 클래스 라이브러리에서 캐시를 구현하고 있습니다.
캐시가 필요한 데이터 모음으로 멤버 변수/속성을로드하는 캐시를 업데이트하는 정적 메소드가있는 싱글 톤 패턴으로 캐시 객체를 만들었습니다 (물론 잠금 로직을 얻었습니다). 나는 전화를 통해 내 데이터에 액세스 할 수 있기 때문에 좋은 방법이라고 생각했습니다.
MyCacheObject.Instance.MyDataCollection
키로 파티셔닝 된 매우 많은 양의 데이터를 저장하기 위해 새 캐시 객체를 만들고 있습니다. 내가 말하는 것은 새 캐시를 만들고 있지만이 캐시는 모든 데이터를 한 번에로드하지 않고 액세스 된 각 키에 대한 컬렉션을 저장합니다.
MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey)
이번에는 쓰레기 수거에 대한 질문이 제기되었습니다. 엄청난 양의 데이터를 저장하고 있기 때문에 갑자기 GC를 얻었다면 폐기물이 아닐까요? 단지 싱글 톤 패턴이기 때문에 데이터가 캐시에 머무를 수있는 것은 없습니다.
그래서 제 질문은 -이 상황을 처리하기 위해 캐시를 구현하기위한 모범 사례는 무엇입니까? 나는 이것에 대한 거대한 복잡한 해결책을 정말로 좋아하지 않으며, 시스템에 캐싱이 있다는 것을 알고 있지만, 이것은 단지 클래스 라이브러리이기 때문에 약간 '꺼져있는 것 같아요, 아니면 어떻게 생각하십니까?
해결책
제 생각에 최상의 솔루션은 다음과 같은 특성을 가질 것입니다.
플랫폼이 제공하는 사용 가능한 캐싱 서비스를 사용하여 자신의 글을 쓰지 않도록 노력합니다.
레이어를 일관성있게하기 위해 클래스 라이브러리를 System.Web에 부여하지 않습니다.
그러나 클래스 라이브러리가 ASP.NET 응용 프로그램 내에서 실행중인 경우 솔루션은 추가 구성 및 설정이 필요한 다른 캐싱 구현 (예 : Enterprise Library Caching Application Block)을 가져와야하지 않아야합니다.
따라서 클래스 라이브러리가 실행중인 환경에 따라 다른 캐싱 구현을 사용할 수 있도록 IOC 전략을 사용합니다.
추상 캐싱 계약을 다음과 같이 정의한다고 가정 해 봅시다.
public interface ICacheService
{
AddItem(...);
}
System.web : Web : 구현을 제공 할 수 있습니다.
public AspNetBasedCacheService : ICacheService
{
AddItem(...)
{
// Implementation that uses the HttpContext.Cache object
}
}
그런 다음 해당 구현을 싱글 톤으로 '게시'하십시오. 원래 접근 방식과의 차이점은 싱글 톤이 전체 '캐시 객체'대신 ASP.NET 캐시 서비스 기반 구현에 대한 참조 일뿐입니다.
public class ChacheServiceProvider
{
public static IChacheService Instance {get; set;}
}
게으른 초기화를 수행하거나 응용 프로그램 시작 (Global.asax.cs)에서 샤치 구현을 초기화해야합니다.
그리고 모든 도메인 구성 요소는 System.Web를 기반으로 구현되었음을 알지 못하고 게시 된 캐싱 서비스를 사용할 수 있습니다.
// inside your class library:
IChacheService chache = CacheServiceProvider.Instance;
cache.AddItem(...);
나는 그것이 가장 간단한 솔루션이 아닐 수도 있다는 데 동의하지만, 코드 디퍼 커플 링 및 유연성을 희생하지 않고 ASP.NET 캐시 구현을 활용하는 것을 목표로하고 있습니다.
나는 당신의 질문을 올바르게 이해하기를 바랍니다.
다른 팁
캐시가 여전히 참조를 보유하는 한 데이터는 쓰레기를 수집하지 않습니다.
또한 싱글 톤을 사용하지 마십시오.