2016-09-14 3 views
0

필자는 Inversion of Control 지식을 향상시키고 자하는 코드를 발견했습니다. 이것이 진정한 IoC입니까?이 IoC의 올바른 구현입니까?

public class DepartmentLogic : IDepartmentLogic 
    { 
     private readonly IDepartmentRepository _departmentRepository; 

     public DepartmentLogic(IDepartmentRepository repo) 
     { 
      _departmentRepository = repo; 
     } 

     public DepartmentLogic() 
     { 
      _departmentRepository = new DepartmentRepository(Constants.CONNECTION_STRING_NAME); 
     } 
    } 

단위 테스트에서이 클래스를 호출하면 조롱 된 IDepartmentRepository가 전달됩니다. 그러나 모든 주요 응용 프로그램 코드는 기본 생성자와 함께 클래스를 사용하며,이 클래스는 콘크리트 DepartmentRepository를 뉴스로 보냅니다.

이 정보가 맞습니까? 나는 당신이 기본 생성자에서 일어나고있는 것처럼 호출 클래스 내의 종속 클래스를 새로 작성해서는 안되며,이 클래스를 생성 한 클래스에서 ConcreteRepository를 새로 작성해야한다고 읽었습니다.

+2

네 말이 맞아. 이 코드는 IoC의 목적을 완전히 이기고 밀접하게 결합 된 유형으로 끝납니다. 단위 테스트의 목적을 위해 IoC 생성자를 만든 것처럼 보이지만 전체적인 설계 방법론으로 채택하지는 않습니다. – itsme86

+0

감사합니다. @ itsme86 - 그게 제가 걱정 한 것입니다. 제가 질문 할 때, "단위 테스트 외에도 IoC에 대한 다른 이유가 없습니다"라는 질문을 받고 응답 방법이 확실하지 않습니다. 저는 그 진술이 무효라고 믿습니다. 그리고 여러 가지 이유가 있지만, 나는 선택할 수없는 것 같습니다. 도와 주실 수 있습니까? – Craig

+0

[이] (https://en.wikipedia.org/wiki/Coupling_ (computer_programming) # Dadadvantages)는 단단히 묶는 단점을 요약합니다. – itsme86

답변

2

클래스에 종속성을 삽입 할 수있는 기능을 제공하고 있습니다.

응용 프로그램이 단순히 기본 생성자를 사용한다고 말하면 실제로 종속성을 주입하지 않았다는 말입니다. 여전히 하드 코딩되어 있습니다.

추가 단계로 이동하여 런타임에 종속성을 "동적으로"생성 한 다음 (종속성 삽입 프레임 워크 또는 기타 사용자 지정 메커니즘을 통해) 클래스에 주입하는 메커니즘을 제공해야합니다.

+0

Thanks @ Justin ... "동적으로"종속성을 만드는 "메커니즘"을 제공 할 때 Unity와 같은 것을 의미합니까? (IoC 컨테이너 - 더 나은 이해를 얻으려고하는 다음) – Craig

+1

@Craig - 정답 (왜 내가 Dependency Injection Frameworks를 언급했는지). 일치는 그들 중 하나 일뿐입니다. 나는 또한 Autofac과 nInject를 좋아한다. –

+0

생성자에서 "new"키워드를 사용할 때마다 밀 결합을 도입하므로, – loneshark99