2009-02-05 3 views

답변

13

MVVM과 함께 ServiceLocator를 사용하여 ViewModel에 대한 선언적 바인딩을 활성화했습니다.

IoC 컨테이너가 푸시 기반 인 반면 ServiceLocator는 끌어 오기 기반입니다. 예를 들면 : 당신이 IoC 컨테이너를 사용하는 경우

당신은 아마 이런 식으로 뭔가를 만들 것이다 : 그것을 구축 할

public MyViewModel(IDataRepository repository) 
{ 
} 

IOC의 컨테이너는 객체로 IDataRepository 인스턴스를 밀어 것입니다. 당신이 ServiceLocator를 사용하는 경우

당신은 일반적으로 다음과 같은 코드를 작성합니다 :

public MyViewModel() 
{ 
    _repository = ServiceLocator.Instance.DataRepository; 
} 

그래서이 경우에는 뷰 모델은 ServiceLocator에서 IDataRepository 인터페이스의 인스턴스를 당기고 있습니다.

ServiceLocator는 IoC 컨테이너에 의해 백업 될 수 있지만 필수는 아닙니다.

이 작업을 수행하는 이점은 ServiceLocator를 App.xaml 파일에 리소스로 추가 한 다음 뷰에서 선언적으로 액세스 할 수 있다는 것입니다.

<UserControl 
    DataContext="{Binding Path=MyViewModel, 
        Source={StaticResource serviceLocator}}">...</UserControl> 

MyViewModel는 IoC 컨테이너에 의해 생성 될 수 있지만 데이터 바인딩과 ServiceLocator를 사용하여보기로 뽑아.

블로그에 blog post about Dependency Injection, IoC and ServiceLocators in a Silverlihgt/MVVM context이 있습니다.

+1

> 블로그 링크가 작동하지 않습니다. 링크를 확인하고 싶을 수 있습니다. – atconway

+0

문제의 기사에 대한 링크를 업데이트했습니다. :) –

1

서비스 검색자는 의존성 주입과 비슷한 디자인 패턴입니다.

소비자는 구체적인 클래스보다는 인터페이스를 기반으로 프로그래밍 할 수 있습니다.

CodePlex에서 호스팅되는 Common Service Locator을 살펴보십시오.

관련 문제