Wstrzykiwanie przez konstruktor
Czytelnie wstrzykuj zależności przez konstruktory
Wstrzykiwanie przez konstruktor to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Wstrzykiwanie przez konstruktor w szczegółach
Wstrzykiwanie przez konstruktor deklaruje każdą zależność jako parametr konstruktora. Obiekt jest w pełni skonfigurowany w chwili utworzenia, dzięki czemu nie można zapomnieć o wymaganych współpracownikach.
Właściwości parametrów
TypeScript pozwala zadeklarować i przypisać zależność w jednym kroku, używając modyfikatora dostępu przy parametrze. private readonly automatycznie tworzy i przypisuje pole.
interface Mailer { send(to: string, body: string): void; }
class Notifier {
constructor(private readonly mailer: Mailer) {}
}Zależności oparte na interfejsach
Zależność od interfejsu zamiast od klasy odseparowuje odbiorcę od konkretnej implementacji. Można dostarczyć dowolny obiekt zgodny z interfejsem.
interface Mailer { send(to: string, body: string): void; }
class SmtpMailer implements Mailer {
send(to: string, body: string) { console.log("SMTP ->", to); }
}Konfigurowanie w punkcie składania
Miejsce, w którym tworzony jest graf obiektów, to punkt składania. W tym miejscu wybiera się konkretne implementacje i wstrzykuje je.
class Notifier {
constructor(private readonly mailer: Mailer) {}
notify(to: string) { this.mailer.send(to, "hello"); }
}
const app = new Notifier(new SmtpMailer());
app.notify("a@b.com");Zamiana implementacji
Ponieważ zależność jest interfejsem, można dostarczyć zupełnie inną implementację bez modyfikowania Notifier. To właśnie podstawowa elastyczność zapewniana przez DI.
class FakeMailer implements Mailer {
sent: string[] = [];
send(to: string) { this.sent.push(to); }
}
const fake = new FakeMailer();
new Notifier(fake).notify("x@y.com");
console.log(fake.sent); // ["x@y.com"]Testowanie bez rzeczywistego I/O
Wstrzyknięcie atrapy modułu pocztowego pozwala testowi sprawdzić, co zostałoby wysłane, bez wysyłania prawdziwej wiadomości. Test jest szybki, deterministyczny i odizolowany.
const fake = new FakeMailer();
new Notifier(fake).notify("test@site");
console.log(fake.sent.length === 1); // trueWiele zależności
Należy wymienić tyle zależności, ile potrzeba. Każda z nich jest jawna, typowana i wymagana, dzięki czemu potrzeby klasy są od razu widoczne.
interface Logger { log(m: string): void; }
class Notifier {
constructor(
private readonly mailer: Mailer,
private readonly logger: Logger,
) {}
}readonly zapobiega ponownemu przypisaniu
Oznaczenie wstrzykniętych pól jako readonly uniemożliwia ich podmianę w trakcie życia obiektu, dzięki czemu jego współpracownicy pozostają stabilni i przewidywalni.
class Notifier {
constructor(private readonly mailer: Mailer) {}
// this.mailer = ... would be a compile error
}Brak ukrytego new wewnątrz
Klasa korzystająca ze wstrzykiwania przez konstruktor nie powinna wewnętrznie tworzyć swoich współpracowników za pomocą new. Wszystkie zależności są dostarczane przez konstruktor, dzięki czemu powiązania pozostają jawne.
Wymagane a opcjonalne
Wymagane zależności powinny znajdować się w konstruktorze. Naprawdę opcjonalnym zależnościom można przypisać domyślną implementację nicnierobiącą, która nadal jest przekazywana z zewnątrz, a nie tworzona wewnątrz.
const noopLogger: Logger = { log() {} };
new Notifier(new SmtpMailer(), noopLogger);Podsumowanie korzyści
Wstrzykiwanie przez konstruktor sprawia, że zależności są jawne, obiekty w pełni zainicjalizowane, implementacje wymienialne, a testy proste. Nie bez powodu jest to domyślny styl DI.
Szybkie sprawdzenie
Szybkie sprawdzenie tej lekcji.
Podsumowanie
Wstrzykiwanie przez konstruktor deklaruje zależności jako parametry, często private readonly, typowane za pomocą interfejsu. Punkt składania wybiera implementacje, a testy przekazują atrapy. Obiekty są zawsze w pełni skonfigurowane, a współpracowników można wymieniać bez edytowania klasy.
Często zadawane pytania
Czy lekcja „Wstrzykiwanie przez konstruktor” jest bezpłatna?
Tak — pełny tekst „Wstrzykiwanie przez konstruktor” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wstrzykiwanie przez konstruktor”?
Czytelnie wstrzykuj zależności przez konstruktory Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?
Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wstrzykiwanie przez konstruktor”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?
Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy odwrócenia sterowania
- Wstrzykiwanie przez konstruktor
- Kontenery DI z InversifyJS
- Bezpieczne typowo tokeny usług