Поиск…


Вступление

Общая идея 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();
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow