2010-07-06 2 views
1

Common Service Locator 코드를 리팩터링하려고합니다. 다른 일부 구성 요소에서 사용하는 공유 라이브러리가 있습니다.ServiceLocator의 소비자가 ServiceLocator.Current를 호출해야합니까?

이해가 안되는 부분은 다음과 같습니다. 이러한 구성 요소는 ServiceLocator.Current를 호출하고 해당 유형을 해결해야합니까? 이 경우 ServiceLocator.Current가 실제로 설정되었는지 어떻게 확인할 수 있습니까? 내 자신의 "MyServiceLocator"를 만들고 정적 생성자를 추가해야합니까? (이는 표준화 된 추상화의 목적을 무력화시키는 것 같습니다)

내 공유 라이브러리에는 해결할 수있는 모든 유형이 공용 속성으로 표시되어 공용 라이브러리의 ServiceLocator가 완전히 유지되는 클래스가 있어야합니까? (추상화 위에 추상화가있는 것을 의미할까요?)

구성 요소가 DI를 통해 만들어지지 않고 필요한 것을 얻기 위해 컨테이너를 호출해야한다는 것이 있습니다.

+1

화상 SL! –

답변

3

shouldn't be using a Service Locator at all. 대신 의존성을 가진 모든 소비자가 확장을 위해 열려있는 인지 확인하십시오 (또는 모든 DI 컨테이너)가 적절한 종속성을 주입 할 수있게하십시오. 생성자 주입이 가장 좋은 옵션입니다.

Krzysztof Kozmic은 최근에 how a DI Container should be used에 대한 개요를 게시했습니다. 그의 사례는 Castle Windsor를 사용하지만, DI 컨테이너뿐만 아니라 Common Service Locator를 추정 할 수 있습니다. 그러나 이러한 원칙을 준수하면 공용 서비스 찾기가 중복이됩니다.

관련 문제