Szukaj…


Wprowadzenie

Ogólna idea Dependency Injection polega na tym, że projektujesz w oparciu o luźno sprzężone komponenty, przestrzegając jednocześnie zasady Dependency Inversion. Nie zależąc od konkretnych wdrożeń, pozwala projektować wysoce elastyczne systemy.

Uwagi

Podstawową ideą wstrzykiwania zależności jest tworzenie luźniej sprzężonego kodu. Gdy klasa, zamiast odkrywać własne zależności, przyjmuje swoje zależności, klasa staje się łatwiejsza do przetestowania jako jednostka ( testowanie jednostkowe ).

Aby rozwinąć luźne połączenie - chodzi o to, że klasy stają się zależne od abstrakcji, a nie od konkrecji. Jeśli klasa A zależy od innej konkretnej klasy B , to nie ma prawdziwego testu A bez B Ten rodzaj testu może być OK, ale nie nadaje się do kodu testowanego jednostkowo. Luźno sprzężony projekt definiowałby abstrakcję IB (jako przykład), od której zależałaby klasa A IB można następnie wyśmiewać, aby zapewnić testowalne zachowanie, zamiast polegać na rzeczywistej implementacji B aby móc zapewnić testowalne scenariusze dla A

Przykład ściśle sprzężony (C #):

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

W powyższym przypadku klasa A zależy od B Nie ma badania A bez konkretnego B Chociaż jest to w porządku w scenariuszu testów integracyjnych, trudno jest przeprowadzić test jednostkowy A

Luźniej sprzężona implementacja powyższego może wyglądać następująco:

public interface IB
{
    void Foo();
}

public class A
{
    private readonly IB _iB;

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

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

Dwie implementacje wydają się dość podobne, istnieje jednak istotna różnica. Klasa A nie jest już bezpośrednio zależna od klasy B , teraz jest zależna od IB . Klasa nie ma A odpowiedzialności z newing swoje własne depedencies - muszą teraz zostać przekazane A .

Zastrzyk setera (C #)

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

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

public interface IBar
{
    void DoSomething();
}

Wtrysk Konstruktora (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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow