웹 애플리케이션에서 게으른로드에 대해 귀찮게해야합니까?
-
06-07-2019 - |
문제
나는 싱글 톤 게으른 하중을 갖는 것이 사용되는 패턴이라는 것을 배웠습니다.
private MyObject()
{
}
public static MyObject Instance
{
get { return SingletonCreator.CreatorInstance; }
}
private static class SingletonCreator
{
private static readonly MyObject _instance = new MyObject();
public static MyObject CreatorInstance
{
get { return _instance; }
}
}
그러나 더 간단한 패턴은 다음과 같습니다.
private static readonly MyObject _instance = new MyObject();
private MyObject()
{
}
public static MyObject Instance
{
get { return _instance; }
}
이것은 게으른 하중이 아닙니다. 그러나 이것이 웹 애플리케이션에서 정말로 귀찮게해야 할 것입니까?
해결책
싱글 톤이 필요하지 않은 정적 방법이 없다면 정적 생성자를 포함하여 클래스를 게으르기에 충분합니다. 정적 생성자가 없으면 여전히입니다 주로 게으른.
내 참조 싱글 톤 구현 페이지 자세한 내용과 옵션.
나는 일반적으로 질문의 맨 아래에 당신이 준 코드를 - 당신이하지 않는 한 그것은 충분히 게으르다. 진짜 싱글 톤이 사용되지 않는 한 초기화하고 싶지 않습니다. (기본적으로 beforefieldinit
세트, JIT는 일반적으로 메소드에 사용 된 모든 유형이 초기화되도록합니다. 없이 beforefieldinit
실행 중에 클래스의 첫 번째 실제 사용이 될 때까지 기다려야합니다. 내 참조 beforefieldinit
페이지 더 많은 정보를 얻으려면 - 중요한 점은 어셈블리가로드 되 자마자 모든 싱글 톤을 초기화하지 않을 것이라는 점입니다.)
다른 팁
그것은 모두 좋고 좋지만 게으른 로딩의 요점은 필요할 때까지 (일반적으로 관리되지 않는) 리소스 (데이터베이스, 파일 시스템 등)를 피하는 것입니다. 필요하다. 싱글 톤 패턴의 사용 자체는 어느 시점에서나 관리되는 인스턴스를 올바르게 생성 할 수 있기 때문에 게으른로드를 암시하는 것은 아닙니다.
적절한 메소드 호출이 이루어질 때만로드되는 자원에 액세스하는 경우 게으른로드 측면이 작동합니다. 해당 싱글 톤 인스턴스가 생성되면 전체 데이터베이스 쿼리를 수행하고 결과를 보관하면 제가 염려하는 한 게으른로드가 아닙니다.
ORM 시나리오와 관련하여 Lazy-Loading은 일반적으로 첫 번째 액세스까지 관계에서 다른 객체의 부하를 연기하는 것을 직접 말하며, 이는 잠재적으로 불필요한 쿼리를 수행하지 않습니다.
그런 다음 다시, 당신이 물체를 사용하는 과정에서 그 관계를 탐색 할 것임을 알게되면 User
그들의 목록을 작성하기 위해 Posts
또는 무언가), 당신은 아마도 당신은 아마도 당신의 ORM에게 관련 객체를 동시에로드하도록 지시하고 싶을 것입니다. 이것은 나중에 여러 쿼리를 반복하고 수행하지 않고 결합 된 단일 쿼리를 수행하도록 팁을 줄 것입니다. 이 경우, 당신은 실제로 게으른로드를 원하지 않습니다.
페이지로드, 세션 및 응용 프로그램 수명을 혼동하지 마십시오. 즉, 정적 싱글 톤 인스턴스를 사용하고 싶습니까? 일단 생성되면 응용 프로그램 (웹 서버)이 종료되거나 실행될 때까지 살게됩니다. iisreset.
캐싱을 고려하십시오 HttpContext.Current.Items
대신 페이지로드 당 게으르게로드 된 인스턴스를 원하거나 HttpContext.Current.Session
사용자 당 하나를 원한다면.