실제로 "올바른"방법은 절대로 다른 선택이없는 한 공장을 전혀 사용하지 않는 것입니다 (단위 테스트 및 특정 모형에서와 같이 생산 코드의 경우 공장을 사용하지 않음)! 그렇게하는 것은 실제로 반 패턴이며 모든 비용을 피해야합니다. DI 컨테이너 뒤에 요점은 가젯이 작업을 수행 할 수 있도록하는 것입니다 에 대한 당신.
이전 게시물에서 언급했듯이 IoC 가젯이 앱에서 다양한 종속 개체를 생성하는 책임을 맡기를 원합니다. 즉, DI 가젯이 다양한 인스턴스 자체를 생성하고 관리 할 수 있습니다. 이것이 DI의 핵심입니다. 객체는 객체가 의존하는 객체를 생성 및 / 또는 관리하는 방법을 절대 알고 있어야합니다. 그렇지 않으면 느슨한 커플 링 이 끊어집니다 .
기존 응용 프로그램을 모든 DI로 변환하는 것은 큰 단계이지만, 그렇게하는 데있어 명백한 어려움을 제외하고, 많은 바인딩 작업을 자동으로 수행하는 DI 도구를 탐색하고 싶을 것입니다. (Ninject와 같은 핵심은 "kernel.Bind<someInterface>().To<someConcreteClass>()"
인터페이스 선언을 인터페이스 구현에 사용하려는 구체적인 클래스와 일치 시키는 호출입니다. DI 가젯이 생성자 호출을 가로 채서 제공 할 수 있도록하는 "바인드"호출입니다. 필요한 종속 객체 인스턴스 일부 클래스의 일반적인 생성자 (여기에 표시된 의사 코드)는 다음과 같습니다.
public class SomeClass
{
private ISomeClassA _ClassA;
private ISomeOtherClassB _ClassB;
public SomeClass(ISomeClassA aInstanceOfA, ISomeOtherClassB aInstanceOfB)
{
if (aInstanceOfA == null)
throw new NullArgumentException();
if (aInstanceOfB == null)
throw new NullArgumentException();
_ClassA = aInstanceOfA;
_ClassB = aInstanceOfB;
}
public void DoSomething()
{
_ClassA.PerformSomeAction();
_ClassB.PerformSomeOtherActionUsingTheInstanceOfClassA(_ClassA);
}
}
참고 갑자기 그 코드에 코드 SomeConcreteClassA 또는 SomeOtherConcreteClassB의 만든 / 관리 / 발표 인스턴스 중 하나였다. 사실, 구체적인 계급도 언급되지 않았습니다. 그래서 ... 마법은 어디에서 일어 났습니까?
앱의 시작 부분에서 다음이 발생했습니다 (다시 이것은 의사 코드이지만 실제 (Ninject)와 거의 비슷합니다 ...).
public void StartUp()
{
kernel.Bind<ISomeClassA>().To<SomeConcreteClassA>();
kernel.Bind<ISomeOtherClassB>().To<SomeOtherConcreteClassB>();
}
이 작은 코드는 Ninject 가젯이 생성자를 찾고, 스캔하고, 처리하도록 구성된 인터페이스 인스턴스 ( "바인드"호출)를 찾은 다음 어디에서 구체적인 클래스의 인스턴스를 작성하고 대체하도록 지시합니다. 인스턴스가 참조됩니다.
Ninject를 Ninject.Extensions.Conventions (또 다른 NuGet 패키지)라고하는 Ninject를 보완하는 멋진 도구가 있습니다. 이 과정을 스스로 구축하면서 겪게 될 훌륭한 학습 경험에서 벗어나지 말고 시작하기 위해서는 조사 도구가 될 수 있습니다.
메모리가 제공되면 Unity (공식적으로 Microsoft의 오픈 소스 프로젝트)에서 동일한 방법으로 메소드 호출을 수행하면 다른 툴에도 비슷한 도우미가 있습니다.
어떤 경로를 선택하든 대량의 DI 교육에 대한 Mark Seemann의 책을 반드시 읽으십시오. 그러나 Mark와 같은 소프트웨어 엔지니어링 세계의 "Great Ones"조차 눈부신 오류를 일으킬 수 있다는 점을 지적해야합니다. 그의 책에서 Ninject는 Ninject를 위해 쓰여진 또 다른 자료입니다. 나는 그것과 그것의 좋은 읽을 거리가 있습니다 : 의존성 주입을위한 Ninject 마스터 링