2012-07-05 2 views
2

나는 우리의 견해 많은 코드 (또는 유사)의이 작품이 :ServiceLocator.Current.GetInstance가 null을 반환 할 수 있습니까?

private IEventAggregator eventAggregator; 

Constructor() 
{ 
    eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>(); 
    ... 
} 

내가 ServiceLocator.Current이 NullReferenceException이 (생성자에 나쁜 일을) 던질 수 this 게시물에서 읽을 수 있지만 나는 궁금했다 GetInstance <() 메소드는 null (또는 다른 일관성없는 객체)을 반환 할 수 있으므로 나중에 다른 메서드에서 사용하기에 eventAggregator를 위험하게 만듭니다.

참고 : 나는 servicelocator가 null의 경우 MVVM 및 WPF

+0

ServiceLocator.Current가 null의 경우는'의 인스턴스로 설정 개체 없음 받게됩니다, 당신은의 .GetInstance () 메서드를 호출 할 수 없습니다 개체 '예외. –

+2

이 작업에 대한 경험이 있으면 ServiceLocator.Current는 단위 테스트에서 코드를 호출 할 때 null이 될 수 있습니다. 이 시나리오에서는 서비스 로케이터가 초기화되지 않았을 가능성이 있습니다 (즉, 코드를 담당하는 코드가 호출되지 않을 수 있음). 해결 방법은 그것을 조롱하는 것입니다 (MOQ 라이브러리를 사용했습니다).하지만 서비스 로케이터가있는 특정 코드를 테스트하기위한 것이지만 우리는 그것에 관심이 없습니다. –

답변

1

아주 새로운 해요, 다음 아마도 일치를 제대로 뭔가하지 설정이 있습니다. 정상적인 상황에서는 문제가 될 수 없습니다.

나는 servicelocator에 도착하는 약간 다른 방법을 사용하는 경향이있다.

예를 들어, MyClass라는 클래스가있는 경우 서비스 통합 자 (통일성있는 컨테이너라고도 함)를 전달하기 위해 단일 종속성 주입을 사용합니다. GetInstance보다는 Resolve 기능을 사용하는 경향이 있지만 동일합니다.

servicelocator가 반 패턴이지만, 나는 그 생각의 라인을 사지 않습니다. http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

예를

기술적
public MyClass(IUnityContainer container) 
{ 
    var ea = container.Resolve<IEventAggregator>(); 
} 
관련 문제