Design patterns
Внедрение зависимости
Поиск…
Вступление
Общая идея Injection Dependency заключается в том, что вы разрабатываете свое приложение вокруг слабо связанных компонентов, придерживаясь принципа инверсии зависимостей. Не зависящая от конкретных реализаций, позволяет разрабатывать гибкие системы.
замечания
Основная идея инъекции зависимостей заключается в создании более слабосвязанного кода. Когда класс вместо новых собственных зависимостей принимает вместо этого свои зависимости, класс становится более простым для тестирования в качестве единицы ( модульное тестирование ).
Чтобы подробнее разобраться в свободной связи, идея состоит в том, что классы становятся зависимыми от абстракций, а не от конкреций. Если класс A
зависит от другого конкретного класса B
, то нет никакого реального тестирования A
без B
Хотя этот вид теста может быть в порядке, он не поддается единому тестируемому коду. Свободно связанная конструкция будет определять абстракцию IB
(в качестве примера), от которой будет зависеть класс A
Затем IB
можно высмеять, чтобы обеспечить проверяемое поведение, вместо того, чтобы полагаться на реальную реализацию B
чтобы быть в состоянии предоставить проверяемые сценарии для A
Тесно связанный пример (C #):
public class A
{
public void DoStuff()
{
B b = new B();
b.Foo();
}
}
В приведенном выше классе A
зависит от B
Нет теста A
без бетона B
Хотя это хорошо в сценарии тестирования интеграции, трудно выполнить единичный тест 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();
}