terminology - design-patterns - Dependency Injection - 의존성 주입이란 무엇입니까?

의존성 주입 인터페이스 / design-patterns / language-agnostic / dependency-injection

사용시기 및이를위한 프레임 워크와 같은 종속성 주입 에 대한 특정 질문과 함께 이미 몇 가지 질문이 게시되었습니다 . 하나,

Peter Mortensen



Answer #1

DIP가 없으면 코드 (이를 '소비 클래스'라고 함)는 구체적인 종속성에 직접 연결되며 종종이 종속성의 인스턴스를 얻고 관리하는 방법을 아는 책임이 있습니다. 즉, 개념적으로 :

"I need to create/use a Foo and invoke method `GetBar()`"
"I need to invoke something which offers `GetBar()`"

다음은 간단한 C # 구현입니다. 아래의 소비 클래스가 주어지면 :

public class MyLogger
{
   public void LogRecord(string somethingToLog)
   {
      Console.WriteLine("{0:HH:mm:ss} - {1}", DateTime.Now, somethingToLog);
   }
}
public interface IClock
{
    DateTime Now { get; }
}
public class MyLogger : ILogger // 기타는 로거에 의존합니다.
{
    private readonly TextWriter _output;
    private readonly IClock _clock;

    // 종속성은 생성자를 통해 주입됩니다.
    public MyLogger(TextWriter stream, IClock clock)
    {
        _output = stream;
        _clock = clock;
    }

    public void LogRecord(string somethingToLog)
    {
        // 이제 추상화를 통해 종속성을 사용할 수 있습니다.
        // 종속성의 수명에 대한 지식없이
        _output.Write("{0:yyyy-MM-dd HH:mm:ss} - {1}", _clock.Now, somethingToLog);
    }
}

자동화 된 단위 테스트를 빌드 할 수 있으며, 이는 이제 우리가 종속성 (시간)을 제어 할 수 있고 작성된 출력을 감시 할 수 있기 때문에 로거가 올바르게 작동하고 있음을 확실하게 증명합니다.

[Test]
public void LoggingMustRecordAllInformationAndStampTheTime()
{
    // 가지런 히하다
    var mockClock = new Mock<IClock>();
    mockClock.Setup(c => c.Now).Returns(new DateTime(2015, 4, 11, 12, 31, 45));
    var fakeConsole = new StringWriter();

    // 행동
    new MyLogger(fakeConsole, mockClock.Object)
        .LogRecord("Foo");

    // 주장
    Assert.AreEqual("2015-04-11 12:31:45 - Foo", fakeConsole.ToString());
}

위의 예에 따라 종속성을 분리하려면 약간의 디자인 노력이 필요하며 개발자에게는 new 종속성 의 습관을 직접 깨뜨리고 대신 컨테이너를 신뢰하여 종속성을 관리하는 데 필요한 패러다임 전환이 필요합니다 .