Suche…


Einführung

Die Grundidee von Dependency Injection besteht darin, dass Sie Ihre Anwendung aus lose gekoppelten Komponenten zusammenstellen und dabei das Prinzip der Abhängigkeitsinversion einhalten. Durch die Abhängigkeit von konkreten Implementierungen können sehr flexible Systeme entworfen werden.

Bemerkungen

Die Grundidee der Abhängigkeitseinspritzung besteht darin, locker gekoppelten Code zu erstellen. Wenn eine Klasse nicht ihre eigenen Abhängigkeiten aufbaut, sondern ihre Abhängigkeiten aufnimmt, lässt sich die Klasse einfacher als Einheit testen ( Unit-Test ).

Um die lose Kopplung weiter zu erläutern - die Idee ist, dass Klassen eher von Abstraktionen als von Konkretionen abhängig werden. Wenn die Klasse A von einer anderen konkreten Klasse B abhängt, gibt es keine echte Prüfung von A ohne B Diese Art von Test kann zwar in Ordnung sein, eignet sich jedoch nicht für Unit-Testable-Code. Ein lose gekoppelter Entwurf würde eine Abstraktion IB (als Beispiel) definieren, von der die Klasse A abhängen würde. IB kann dann verspottet werden, um testbares Verhalten bereitzustellen, anstatt sich auf die tatsächliche Implementierung von B zu verlassen, um testbare Szenarien für A bereitzustellen.

Dicht gekoppeltes Beispiel (C #):

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

In A hängt die Klasse A von B . Es gibt keine Prüfung A ohne Beton B Während dies in einem Integrationstestszenario in Ordnung ist, ist es schwierig, A zu testen.

Eine locker gekoppelte Implementierung des obigen könnte folgendermaßen aussehen:

public interface IB
{
    void Foo();
}

public class A
{
    private readonly IB _iB;

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

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

Die beiden Implementierungen scheinen ziemlich ähnlich zu sein, es gibt jedoch einen wichtigen Unterschied. Klasse A ist nicht mehr direkt von Klasse B abhängig, sondern von IB . Klasse A nicht mehr die Verantwortung von newing bis seine eigenen depedencies - sie müssen jetzt zur Verfügung gestellt werden A .

Setterinjektion (C #)

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

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

public interface IBar
{
    void DoSomething();
}

Konstruktorinjektion (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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow