2012-10-18 2 views
0

우리는 클래스 IoC<TContainer>을 가지고 있습니다. TContainer은 클래스를 포함하는 모듈에서 사용하는 모든 IoC 컨테이너를 래핑하는 클래스입니다. 다음과 같이 구현됩니다상속 된 정적 속성 초기화

public class SMIoC : IoC<StructureMapServiceLocator> 
{ 
    private SMIoC() 
    {} 

    static SMIoC() 
    { 
     Container = ... // Initialization 
    } 
} 

:

현재
public class IoC<TContainer> 
    where TContainer : IServiceLocator 
{ 
    public static TContainer Container { get; set; } 

    public static T Resolve<T>() 
    { 
     return Container.Resolve<T>(); 
    } 
    public static object Resolve(Type type) 
    { 
     return Container.Resolve(type); 
    } 
    public static IEnumerable<T> ResolveAll<T>() 
    { 
     return Container.ResolveAll<T>(); 
    } 
    public static IEnumerable ResolveAll(Type type) 
    { 
     return Container.ResolveAll(type); 
    } 
} 

, 어딘가에는 사용을 단순화하기 위해이

IoC<StructureMapServiceLocator>.Container = ... 

처럼 초기화 할 필요가있다,이 같은 클래스를 정의하려 그러나이 작동하지 않습니다 (Earlier question) 및이 잘못된 디자인 제안되었습니다. 어떻게 초기화 (정적 생성자를 사용하거나 다른 메서드를 사용하여) 또는 다른 트릭을 자동화 할 수 있습니까?

답변

0

보통 내가 할 해당 응용 프로그램이나 서비스를 사용하는 초기화 동안 응용 프로그램 :

  • ASP.NET. Global.asax Application_Start 이벤트 또는 사용자 지정 HTTP 모듈.
  • 웹 API. ASP.NET과 동일합니다.
  • 윈도우 폼/WPF/실버 ...... Main()
  • ...

나는 정적 생성자에 의존하지 않을 것입니다. 컨테이너가 요청이나 스레드를 할당 받았는지 확인해야하는 경우 각 플랫폼에서 메서드 재정의, 이벤트 또는 프레임 워크 초기화 중에 실행되는 모든 것이 있기 때문에 위에서 설명한 내용을 선호합니다. (단일 스레드가 컨테이너를 초기화하고 정적 속성으로 설정하는 순간, 초기화가 끝날 때까지 다른 스레드는 차단됩니다).

마지막으로, 정적 속성을 제어 컨테이너의 반전을 설정하는 더 일반적인, 멀티 플랫폼 안전 방법이 없다. 일이 올바르게 끝나기 위해서는 힌트를 가져라! :)