4

BaseFormILogger 또는 IResourceManager 또는 그와 유사한 것으로 가정합니다. 현재 그것은 안티 패턴 인 서비스 로케이터를 사용하여 필요한 서비스의 올바른 구현을 해결합니다.IOC 컨테이너, 서비스 위치 지정자 및 공장을 사용하는 것에 혼동이 있음

  • 생성자 삽입을 사용하여 이러한 종류의 종속성을 해결하는 올바른 방법이 있습니까?
  • 의존성이있는 인스턴스를 만들기 위해 BaseForm (및 파생 된 유형)을 컨테이너에 등록해야합니까? 그게 모든 것을 복잡하게하지 않습니까?
  • 서비스 탐지기를 감싸는 정적 팩토리를 사용하는 것이 좋지 않습니까?
  • 단위 테스트는 제쳐두고, 서비스 로케이터 방지 패턴을 사용하기 때문에 정말로 처벌 될 것입니까?

죄송합니다. 한 번에 많은 질문을드립니다. 나는 다음과 같은 SO 질문 및 많은 다른 사람을 읽었습니다 있지만 단지 내 혼란에 추가 읽을 거리 :

답변

8

가능하다면, 당신은 항상 의존성으로 가야한다 그것은 약간의 명확한 힘을 가지고 있기 때문에 주사. 그러나 UI 기술을 사용하면 일부 UI 기술 (예 : .NET 양식, Win Forms 및 Web Forms)에서는 UI 클래스 (양식, 페이지, 컨트롤 등)만이 종속성 주입을 사용할 수있는 것은 아닙니다. 디폴트 생성자. 이 경우 서비스 로케이터 인 다른 것으로 넘어져야합니다. 이 경우

내가 당신에게 다음과 같은 조언을 제공 할 수 있습니다 :

  • 만 의존성 주입을 사용하여 컨테이너를 생성 할 수 없습니다 UI 클래스 다시 서비스 로케이터로 하락하고, 물건 당신이 그런가 것을 어쨌든 단위 테스트.
  • 해당 UI 클래스에서 가능한 적은 로직을 구현하십시오 (보기 관련 항목 만있는 Humble objects). 이렇게하면 가능한 한 단위 테스트를 할 수 있습니다.
  • 컨테이너를 정적 메서드로 감싸서 컨테이너를 응용 프로그램의 나머지 부분에서 숨 깁니다. 종속성을 확인할 수없는 경우이 정적 메서드에 대한 호출이 실패하는지 확인하십시오.
  • 해당 형식의 (기본값) 생성자에서 모든 종속성을 확인하십시오. 이렇게하면 나중에 버튼을 클릭 할 때가 아니라 해당 유형을 만들 때 종속성 중 하나를 해결할 수 없을 때 응용 프로그램이 빠르게 실패 할 수 있습니다.
  • 앱을 시작하는 동안 (또는 단위 테스트를 사용하여) 모든 UI 유형을 만들 수 있는지 확인하십시오. DI 구성에 오류가 있는지 확인하기 위해 모든 양식을 열어 전체 응용 프로그램을 거치지 않아도됩니다.
  • 컨테이너에서 형식을 작성할 수없는 경우 컨테이너에 형식을 등록 할 필요가 없습니다. 컨테이너 (ASP.NET MVC Controller 클래스 등)에서 컨테이너를 만들 수있는 경우 명시 적으로 등록하는 것이 유용 할 수 있습니다. 일부 컨테이너는 구성을 먼저 확인할 수 있도록하기 때문에 명시 적으로 구성 오류를 감지합니다 떨어져.

단위 테스트 외에, 그의 유명한 블로그 게시물 Service Locator is an Anti-Pattern에 마크 시만에 의해 제공되는 서비스 로케이터의 사용에 대한 두 가지 다른 중요한 인자가있다 :

  • 서비스 로케이터 '클래스'를 숨 깁니다 런타임 오류 대신 컴파일 시간 오류 "
  • 서비스 로케이터는"어려운 코드가 아닌 UI 클래스에 대한
+0

무엇을 "유지하기 위해 만드는 원인이 종속? 컨테이너 내부에 종속 클래스 (구성 요소 또는 서비스가 아닌)를 모두 등록한 것처럼 느껴지지 않습니다. – reticent

+0

그 밖의 모든 작업은 DI를 사용하여 컨테이너에서 해결할 수 있는지 확인하십시오. 대부분의 컨테이너는 일괄 등록을 ​​수행 할 수 있습니다. 즉, (관련) 구성 요소 전체 세트를 하나 또는 몇 개의 명령문에 등록 할 수 있습니다. 이렇게하면 컴포지션 루트를 작고 유지할 수 있습니다. – Steven