팩토리는 테스트를 어렵게 만들고 구현을 쉽게 교체 할 수 없습니다. 또한 종속성을 명확하게 나타내지 않습니다 (예 : 데이터베이스를 사용하는 메소드를 호출하는 메소드를 호출하는 메소드를 호출한다는 사실을 알지 못하는 메소드 검사).
동의하지 않습니다. 적어도 일반적으로 아닙니다.
간단한 공장 :
public IFoo GetIFoo()
{
return new Foo();
}
간단한 주사 :
myDependencyInjector.Bind<IFoo>().To<Foo>();
두 스 니펫은 동일한 목적으로 사용되며 IFoo와 사이에 링크를 설정합니다 Foo. 다른 모든 것은 단지 구문입니다.
변경 Foo하려면 ADifferentFoo두 코드 샘플에서 정확히 많은 노력이 필요합니다.
사람들은 의존성 주입이 다른 바인딩을 사용할 수 있다고 주장하지만, 다른 팩토리를 만드는 것에 대해 동일한 주장을 할 수 있다고 들었습니다. 올바른 바인딩을 선택하는 것은 올바른 팩토리를 선택하는 것만큼이나 복잡합니다.
공장 방법을 사용하면 Foo일부 장소 및 ADifferentFoo다른 장소에서 사용할 수 있습니다 . 어떤 사람들은 이것을 좋은 것으로 부를 수도 있고 (필요한 경우에 유용 할 수도 있습니다), 어떤 사람들은 이것을 나쁜 것으로 부를 수도 있습니다 (모든 것을 교체하는 데 절반의 노력을 기울일 수 있습니다).
그러나 IFoo항상 단일 소스를 갖도록 리턴하는 단일 메소드를 고수하는 경우이 모호성을 피하는 것이 그리 어려운 것은 아닙니다. 발로 자신을 쏘고 싶지 않다면, 장전 된 총을 잡거나 발에 겨냥하지 마십시오.
Dependecy injection은 생성자 인수 목록을 크게 팽창시키고 코드 전체에서 일부 측면을 번집니다.
이런 이유로 일부 사람들은 생성자에서 다음과 같이 명시 적으로 종속성을 검색하는 것을 선호합니다.
public MyService()
{
_myFoo = DependencyFramework.Get<IFoo>();
}
나는 인수 pro (생성자 부풀림 없음)를 들었고, 인수 con을 들었습니다 (생성자를 사용하면 더 많은 DI 자동화가 가능합니다).
개인적으로 생성자 인수를 사용하려는 선배에게 양보했지만 VS의 드롭 다운 목록 (오른쪽 상단, 현재 클래스의 메소드를 탐색)에서 문제가 발생했을 때 메소드 이름이 보이지 않는 문제를 발견했습니다. 메소드 서명 중 화면이 내 화면보다 깁니다 (=> 부풀린 생성자).
기술적 인 수준에서 나는 어느 쪽이든 상관하지 않습니다. 어느 옵션이든 입력하는 데 많은 노력이 필요합니다. DI를 사용하기 때문에 일반적으로 생성자를 수동으로 호출하지 않습니다. 그러나 Visual Studio UI 버그는 생성자 인수를 부 풀리지 않는 것을 선호합니다.
부수적으로, 의존성 주입과 팩토리는 상호 배타적이지 않습니다 . 종속성을 삽입하는 대신 종속성을 생성하는 팩토리를 삽입 한 경우가 있습니다 (NInject Func<IFoo>를 사용하면 실제로 팩토리 클래스를 만들 필요가 없습니다).
이에 대한 사용 사례는 드물지만 존재합니다.