Design patterns
의존성 주입
수색…
소개
Dependency Injection의 일반적인 개념은 의존성 반전 원칙을 준수하면서 느슨하게 결합 된 구성 요소 주위에 응용 프로그램을 설계하는 것입니다. 구체적인 구현에 의존하지 않음으로써 매우 유연한 시스템을 설계 할 수 있습니다.
비고
의존성 주입의 기본 개념은 느슨하게 결합 된 코드를 만드는 것입니다. 클래스가 자체 종속성을 새로 작성하는 대신 종속성을 대신 사용하면 클래스를 단위로 테스트 하는 것이 더 간단 해집니다 ( 단위 테스트 ).
느슨한 결합에 대해 더 자세히 설명하기 위해 클래스는 클래스보다는 추상에 의존하게된다. 클래스의 경우 A
다른 구체적인 클래스에 따라 B
, 다음의 실제 테스트가없는 없는 A
B
. 이런 종류의 테스트는 괜찮지 만 단위 테스트 할 수있는 코드에는 적합하지 않습니다. 느슨하게 결합 된 설계는 클래스 A
가 의존하는 추상화 IB
(예로서)를 정의합니다. IB
는 A
테스트 가능한 시나리오를 제공 할 수 있도록 B
의 실제 구현에 의존하기보다는 테스트 가능한 동작을 제공하기 위해 조롱받을 수 있습니다.
밀접하게 결합 된 예제 (C #) :
public class A
{
public void DoStuff()
{
B b = new B();
b.Foo();
}
}
위의 경우 클래스 A
는 B
종속됩니다. 콘크리트 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();
}