문제

웹에서 본 대부분의 샘플에서 MVC 컨트롤러의 DI는 다음과 같이 수행됩니다.

public ProductController(IProductRepository Rep)
{
    this._rep = Rep;
}

사용자 정의 ControlLerFactory가 사용되며 선택의 DI 프레임 워크를 사용하고 저장소가 주입됩니다.

위의 이유는 왜 더 나은 것으로 간주 되는가

public ProuctController()
{
    this._rep = ObjectFactory.GetInstance<IProductRepository>();
}

이것은 동일한 결과를 얻지 만 사용자 정의 컨트롤러 공장이 필요하지 않습니다.

테스트와 관련하여 테스트 앱은 별도의 부트 스트랩퍼를 가질 수 있습니다. 그렇게하면 컨트롤러가 테스트 될 때는 가짜 리포지토리를 얻을 수 있으며 실제 저장소를 사용하면 실제 저장소를 얻을 수 있습니다.

도움이 되었습니까?

해결책

생성자 주입 (첫 번째 접근법)은 여러 가지 이유로 서비스 로케이터 패턴 (두 번째 접근법)보다 낫습니다.

먼저 서비스 로케이터는 종속성을 숨 깁니다. 두 번째 예에서는 공개 인터페이스 만 보면 알 수있는 방법이 없습니다. ProductControllers 저장소가 필요합니다.

더구나, 나는 에코를해야한다 Odetocode. 제 생각에는

IProductRepository repository = Mockery.NewMock<IProductRepository>();
IProductController controller = new ProductController(repository);

보다 명확합니다

ObjectFactory.SetFactory(IProductRepository, new MockRepositoryFactory())
IProductController controller = new ProductController();

특히 객체 Factory가 테스트 고정물에서 구성된 경우 SetUp 방법.

마지막으로, 서비스 로케이터 패턴은 적어도 하나의 특정 사례에서 명백히 차선책입니다. 통제 이외의 응용 프로그램을 작성하는 사람들이 소비 할 코드를 작성할 때. 나는 사람들이 일반적으로 모든 시나리오에 적용 할 수 있기 때문에 생성자 주입 (또는 다른 DI 방법 중 하나)을 선호한다고 베팅합니다. 모든 경우를 다루는 방법을 사용하지 않는 이유는 무엇입니까?

(Martin Fowler는 훨씬 더 철저한 분석을 제공합니다. "제어 용기의 역전 및 종속성 주입 패턴", 특히 "서비스 로케이터 대 종속성 주입"섹션.

다른 팁

두 번째 생성자의 기본 단점은 이제 각 테스트마다 IOC 컨테이너를 올바르게 구성해야한다는 것입니다. 코드 기반이 커지고 테스트 시나리오가 더욱 다양 해짐에 따라이 설정은 실제 부담이 될 수 있습니다. 테스트는 일반적으로 테스트 더블로 명시 적으로 통과 할 때 읽고 유지하기가 더 쉽습니다.

또 다른 관심사는 수많은 클래스를 특정 DI/IOC 프레임 워크에 연결하는 것입니다. 물론 그것을 추상화시키는 방법이 있지만, 수업 전반에 걸쳐 코드가 흩어져있어 종속성을 검색합니다. 모든 좋은 프레임 워크는 생성자를 보면 필요한 종속성을 파악할 수 있으므로 많은 낭비 된 노력과 복제 코드입니다.

두 번째 접근법을 사용하면 단점은 다음과 같습니다.

  • 거대하고 읽을 수없는 테스트 설정/컨텍스트 방법이 필요합니다.
  • 컨테이너는 컨트롤러에 연결됩니다
  • 더 많은 코드를 작성해야합니다

종속성 주입을 원하지 않을 때 어쨌든 IOC 컨테이너를 사용하려는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top