Inversion of Control은 프레임 워크 호출을 사용자 코드로 되돌리기위한 개념입니다. . 이는 매우 추상적 인 개념이며 단순히 라이브러리와 프레임 워크의 차이점을 설명하거나 "프레임 워크의 특성 정의"로 설명 될 수 있습니다. 라이브러리는 코드에 의해 호출되는 반면 프레임 워크는 코드를 제어합니다. 모든 프레임 워크는 코드를 플러그인 할 수있는 후크를 제공합니다.
제어 반전은 프레임 워크를 만드는 동안 프레임 워크 개발자이거나 프레임 워크 코드와 상호 작용하는 응용 프로그램 개발자 인 경우에만 적용 할 수있는 패턴입니다. 그러나 IoC는 응용 프로그램 코드 만 사용하는 경우에는 적용되지 않습니다.
구현 대신 추상화에 의존하는 동작을 종속성 반전이라고하며, 종속성 반전은 응용 프로그램 및 프레임 워크 개발자가 모두 수행 할 수 있습니다. 그래서 당신이 IoC로 부르는 것은 실제로 Dependency Inversion입니다. Krzysztof가 이미 언급했듯이 : 당신이하는 일은 IoC가 아닙니다. Dependency Inversion에 대해서는 앞으로 논의 할 것입니다.
기본적으로 Dependency Inversion의 두 가지 형식/구현이 있습니다. Service Locator와 Dependency Injection이 있습니다.
서비스 검색 자 패턴을 사용하면 종속성이 필요한 클래스 내에서 정적 팩토리를 호출합니다. 일반적으로, 다음과 같습니다 당신은 서비스 로케이터 패턴을 사용하고 있습니다 :
public class Service
{
public void SomeOperation() {
IDependency dependency =
ServiceLocator.GetInstance<IDependency>();
dependency.Execute();
}
}
이 예제는 당신이 당신의 Logon
방법에하고있는 일이 있기 때문에, 당신에게 익숙 할 것이다.
종속성 삽입 패턴을 사용하면 외부에서 필요로하는 모든 종속성을 주입 할 수 있습니다. 바람직하게는 생성자를 사용한다. 클래스 자체는 의존성을 가져올 책임이 없습니다. 그 책임은 호출 스택 위로 이동됩니다. 이전 클래스는 사용 종속성 주입과 같습니다
public class Service
{
private readonly IDependency dependency;
public Service(IDependency dependency)
{ this.dependency = 의존성; }
public void SomeOperation()
{ this.dependency.Execute(); 두 경우 모두에서 Service
클래스는 종속성을 만드는 책임을지지 않습니다이며 사용되는 구현을 알 수 없기 때문에 } }
두 패턴 종속성 반전이다. 인터페이스와 만 통신합니다. 두 패턴 모두 클래스가 사용하는 구현에 대해 유연성을 제공하므로보다 유연한 소프트웨어를 작성할 수 있습니다.
그러나 서비스 로케이터 패턴에는 많은 문제점이 있으며, 이것이 안티 패턴으로 간주되는 이유입니다. Dependency Inversion (귀하의 경우 Service Locator)이 단위 테스트에 어떻게 도움이되는지 궁금해하기 때문에 이미 이러한 문제가 발생하고 있습니다.
대답은 Service Locator 패턴이 단위 테스트에 도움이되지 않는다는 것입니다. 오히려 단위 테스트가 매우 어렵습니다. 클래스가 ObjectFactory
을 호출하게함으로써 두 클래스 사이에 강력한 종속성을 생성하게됩니다. 테스트를 위해 IAccountRepository
을 대체하면 단위 테스트에 ObjectFactory
을 사용해야 함을 의미합니다. 이렇게하면 단위 테스트를 읽기가 더 어려워집니다. 그러나 더 중요한 것은 ObjectFactory
이 정적 인스턴스이기 때문에 모든 유닛 테스트가 동일한 인스턴스를 사용하므로 테스트별로 격리 및 스왑 구현에서 테스트를 실행하기가 어렵습니다.
이전에는 Service Locator 패턴을 사용 했었고,이를 처리하는 방법은 서비스 로케이터에 스레드 기반으로 변경할 수있는 종속성을 등록하는 것입니다 ([ThreadStatic] 필드 사용). 표지). 이를 통해 테스트를 격리 된 상태로 유지하면서 내 테스트를 병렬로 실행할 수있었습니다 (기본적으로 MSTest가 수행하는 작업). 그러나이 문제는이 작업이 매우 복잡해지고 모든 종류의 기술 자료로 테스트가 복잡해졌으며 더 많은 테스트를 작성하면서 많은 시간을 소비하여 이러한 기술적 인 문제를 해결할 수있었습니다.
이러한 문제에 대한 진정한 해결책은 종속성 주입입니다. 클래스가 생성자를 통해 필요로하는 종속성을 주입하면 모든 문제가 사라집니다. 이렇게하면 클래스가 필요로하는 종속성 (숨겨진 종속성이 없음)이 무엇인지 명확하게 알 수있을뿐만 아니라 모든 유닛 테스트 자체가 필요한 종속성을 주입하는 역할을합니다. 따라서 필기 테스트가 훨씬 쉬워지고 단위 테스트에서 DI 컨테이너를 구성하지 않아도됩니다.
추가 읽기 : Service Locator is an Anti-Pattern.
그건 IoC가 아닙니다. –