문제

나는 싱글 톤 게으른 하중을 갖는 것이 사용되는 패턴이라는 것을 배웠습니다.

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 사용자 당 하나를 원한다면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top