Aby zrobić to dobrze, musimy najpierw zdefiniować zależności i zastrzyk.
- Zależność: każdy zasób potrzebny operacji.
- Zastrzyk: przekazanie tego zasobu do operacji, zwykle jako argument metody.
Podstawowym przykładem byłaby metoda, która dodaje dwie wartości. Oczywiście metody te wymagają dodania wartości. Jeśli zostaną dostarczone przez przekazanie ich jako argumentów, byłby to już przypadek wstrzyknięcia zależności. Alternatywą byłoby zaimplementowanie argumentów jako właściwości lub zmiennych globalnych. W ten sposób nie zostałyby wstrzyknięte żadne zależności, zależności byłyby dostępne z zewnątrz z góry.
Załóżmy, że zamiast tego używasz właściwości i nadajesz im nazwy A i B. Jeśli zmienisz nazwy na Op1 i Op2, przerwiesz metodę Add. Lub twoje IDE zaktualizuje dla ciebie wszystkie nazwy, chodzi o to, że metoda również musiałaby zostać zaktualizowana, ponieważ ma zależności od zasobów zewnętrznych.
Ten przykład jest prosty, ale możesz sobie wyobrazić bardziej złożone przykłady, w których metoda wykonuje operację na obiekcie, takim jak obraz lub gdzie odczytuje ze strumienia pliku. Czy chcesz, aby metoda sięgnęła po obraz, wymagając, aby wiedział, gdzie on jest? Nie. Czy chcesz, aby metoda otworzyła sam plik, wymagając od niego wiedzy, gdzie szukać pliku, a nawet wiedząc, że będzie on czytał z pliku? Nie.
Chodzi o to, aby zredukować funkcjonalność metody do jej podstawowego zachowania i oddzielić metodę od środowiska. Otrzymujesz pierwszy, robiąc drugi, możesz uznać to za definicję wstrzykiwania zależności.
Korzyści: ponieważ wyeliminowano zależności dla środowiska metody, zmiany w metodzie nie będą miały wpływu na środowisko i odwrotnie. => Aplikacja staje się łatwiejsza w utrzymaniu (modyfikacji).