수색…


소개

Dependency Injection의 일반적인 개념은 의존성 반전 원칙을 준수하면서 느슨하게 결합 된 구성 요소 주위에 응용 프로그램을 설계하는 것입니다. 구체적인 구현에 의존하지 않음으로써 매우 유연한 시스템을 설계 할 수 있습니다.

비고

의존성 주입의 기본 개념은 느슨하게 결합 된 코드를 만드는 것입니다. 클래스가 자체 종속성을 새로 작성하는 대신 종속성을 대신 사용하면 클래스를 단위로 테스트 하는 것이 더 간단 해집니다 ( 단위 테스트 ).

느슨한 결합에 대해 더 자세히 설명하기 위해 클래스는 클래스보다는 추상에 의존하게된다. 클래스의 경우 A 다른 구체적인 클래스에 따라 B , 다음의 실제 테스트가없는 없는 A B . 이런 종류의 테스트는 괜찮지 만 단위 테스트 할 수있는 코드에는 적합하지 않습니다. 느슨하게 결합 된 설계는 클래스 A 가 의존하는 추상화 IB (예로서)를 정의합니다. IBA 테스트 가능한 시나리오를 제공 할 수 있도록 B 의 실제 구현에 의존하기보다는 테스트 가능한 동작을 제공하기 위해 조롱받을 수 있습니다.

밀접하게 결합 된 예제 (C #) :

public class A
{
    public void DoStuff()
    {
        B b = new B();
        b.Foo();
    }
}

위의 경우 클래스 AB 종속됩니다. 콘크리트 B 가없는 테스트 A 는 없습니다. 통합 테스트 시나리오에서는 이것이 괜찮지 만 단위 테스트 A 는 어렵습니다.

위의 더 느슨하게 결합 된 구현은 다음과 같이 보일 수 있습니다.

public interface IB
{
    void Foo();
}

public class A
{
    private readonly IB _iB;

    public A(IB iB)
    {
        _iB = iB;
    }

    public void DoStuff()
    {
        _b.Foo();
    }
}

두 가지 구현은 매우 유사하지만 중요한 차이점이 있습니다. 클래스 A 는 더 이상 클래스 B 에 직접 종속되지 않으며 이제는 IB 종속됩니다. 클래스 A 더 이상 없습니다 책임 newing까지 자신의 depedencies의를 - 그들은 지금에 제공해야합니다 . A

세터 주입 (C #)

public class Foo
{
    private IBar _iBar;
    public IBar iBar { set { _iBar = value; } }

    public void DoStuff()
    {
        _iBar.DoSomething();
    }
}

public interface IBar
{
    void DoSomething();
}

생성자 삽입 (C #)

public class Foo
{
    private readonly IBar _iBar;

    public Foo(IBar iBar)
    {
        _iBar = iBar;
    }

    public void DoStuff()
    {
        _bar.DoSomething();
    }
}

public interface IBar
{
    void DoSomething();
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow