Podczas przeglądania artykułów na temat wzorców projektowych (lokalizator usług) przyglądałem się terminom wstrzykiwanie konstruktora i wstrzykiwanie zależności.
Kiedy przejrzałem Google na temat wstrzykiwania konstruktora, otrzymałem niejasne wyniki, które skłoniły mnie do sprawdzenia się tutaj.
Co to jest zastrzyk konstruktora? Czy to specyficzny rodzaj wstrzyknięcia zależności? Świetnym rozwiązaniem byłby kanoniczny przykład!
Edytować
Powracając do tych pytań po upływie tygodnia, widzę, jak bardzo się zgubiłem ... Na wypadek, gdyby ktoś tu pojawił się, zaktualizuję treść pytania, zapoznając się z moim. Prosimy o komentarz / poprawienie. Zastrzyk konstruktora i zastrzyk właściwości są dwoma rodzajami wstrzyknięcia zależności.
c#
dependency-injection
TheSilverBullet
źródło
źródło
Odpowiedzi:
Nie jestem ekspertem, ale myślę, że mogę pomóc. I tak, jest to szczególny rodzaj wstrzykiwania zależności.
Oświadczenie: Prawie wszystko zostało „skradzione” z Wiki Ninject
Przeanalizujmy pomysł wstrzykiwania zależności, przechodząc przez prosty przykład. Załóżmy, że piszesz następną hitową grę, w której szlachetni wojownicy walczą o wielką chwałę. Po pierwsze, potrzebujemy broni odpowiedniej do uzbrojenia naszych wojowników.
Następnie stwórzmy klasę reprezentującą samych naszych wojowników. Aby zaatakować wrogów, wojownik będzie potrzebował metody Attack (). Po wywołaniu tej metody powinien użyć Miecza, aby uderzyć przeciwnika.
Teraz możemy stworzyć naszych samurajów i walczyć!
Jak możesz sobie wyobrazić, to wydrukuje Wytnij złoczyńców do połowy na konsoli. Działa to dobrze, ale co, jeśli chcielibyśmy uzbroić naszego Samuraja w inną broń? Ponieważ Miecz jest tworzony wewnątrz konstruktora klasy Samuraj, musimy zmodyfikować implementację klasy, aby dokonać tej zmiany.
Kiedy klasa jest zależna od konkretnej zależności, mówi się, że jest ściśle powiązana z tą klasą . W tym przykładzie klasa samurajów jest ściśle powiązana z klasą miecza. Gdy klasy są ściśle powiązane, nie można ich zamieniać bez zmiany ich implementacji. Aby uniknąć ścisłego łączenia klas, możemy użyć interfejsów, aby zapewnić poziom pośredni. Stwórzmy interfejs reprezentujący broń w naszej grze.
Następnie nasza klasa Sword może wdrożyć ten interfejs:
I możemy zmienić naszą klasę samurajów:
Teraz nasz samuraj może być uzbrojony w inną broń. Ale poczekaj! Miecz wciąż powstaje w konstruktorze Samuraja. Ponieważ wciąż musimy zmienić implementację Samuraja, aby dać naszemu wojownikowi kolejną broń, Samuraj jest nadal ściśle związany z Mieczem.
Na szczęście istnieje łatwe rozwiązanie. Zamiast tworzyć Miecz z konstruktora Samuraja, możemy go odsłonić jako parametr konstruktora. Znany również jako wstrzykiwanie konstruktora.
Jak zauważył Giorgio, istnieje również zastrzyk nieruchomości. To byłoby coś w stylu:
Mam nadzieję że to pomoże.
źródło
Spróbuję jak najwięcej, aby uczynić to bardzo elementarnym. W ten sposób możesz bazować na koncepcji i tworzyć własne złożone rozwiązania lub pomysły.
Teraz wyobraź sobie, że mamy kościół o nazwie Jubileusz, który ma oddziały na całym świecie. Naszym celem jest zdobycie przedmiotu z każdej gałęzi. Oto rozwiązanie z DI;
1) Utwórz interfejs IJubilee:
2) Utwórz klasę JubileeDI, która pobierze interfejs IJubilee jako konstruktor i zwróci element:
3) Teraz utwórz trzy broszury Jubilee, a mianowicie JubileeGT, JubileeHOG, JubileeCOV, które MUSZĄ odziedziczyć interfejs IJubilee. Dla zabawy spraw, aby jeden z nich zaimplementował swoją metodę jako wirtualną:
4) To jest to! Zobaczmy teraz DI w akcji:
Do każdej instancji klasy kontenera przekazujemy nową instancję wymaganej klasy, która umożliwia luźne sprzężenie.
Mam nadzieję, że wyjaśnia to w skrócie.
źródło
Załóżmy, że masz klasę,
A
z której każda instancja potrzebuje instancji innej klasyB
.Wstrzykiwanie zależności oznacza, że odwołanie
B
jest ustawiane przez obiekt, który zarządza wystąpieniemA
(w przeciwieństwieA
doB
bezpośredniego zarządzania odwołaniem przez klasę ).Wstrzykiwanie konstruktora oznacza, że odniesienie
B
jest przekazywane jako parametr do konstruktoraA
i ustawiane w konstruktorze:Alternatywą jest użycie metody ustawiającej (lub właściwości) do ustawienia odwołania
B
. W tym przypadku obiekt, który zarządza wystąpieniea
zA
musi najpierw wywołać konstruktorA
, a później zadzwonić setter ustawić zmienną użytkownikaA.b
przeda
służy. Ta ostatnia metoda wtrysku jest konieczne, gdy obiekty zawierają cykliczne odniesienia do siebie, na przykład, jeśli przykładb
zB
, który jest ustawiony w przypadkua
odA
zawiera odniesienie do tyłua
.** EDYTOWAĆ**
Oto kilka dodatkowych szczegółów dotyczących komentarza.
1. Klasa A zarządza instancją B.
2. Instancja B jest ustawiona w konstruktorze
3. Instancja B jest ustawiana za pomocą metody setter
źródło
itemA
lubobjectA
tylko w celu przedłużenia nazwy, nie zawsze jest lepsze.