TypeScript Academy · Oppitunti

Riippuvuuksien injektointi konstruktorilla

Injektoikaa riippuvuudet siististi konstruktoreiden kautta.

Oppitunti 2/413 vaihetta

Riippuvuuksien injektointi konstruktorilla on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu TypeScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.

Konstruktorin injektointi perusteellisesti

Konstruktorin injektoinnissa jokainen riippuvuus ilmoitetaan konstruktorin parametrina. Olio on täysin kytketty heti luomishetkellä, joten pakollisia yhteistyökomponentteja ei voi unohtaa.

Parametriominaisuudet

TypeScript voi ilmoittaa ja määrittää riippuvuuden yhdellä kertaa käyttämällä parametrissa näkyvyysmääritettä. private readonly luo kentän ja määrittää sen automaattisesti.

interface Mailer { send(to: string, body: string): void; }
class Notifier {
  constructor(private readonly mailer: Mailer) {}
}

Rajapintoihin perustuvat riippuvuudet

Rajapintaan eikä luokkaan perustuva riippuvuus irrottaa käyttäjän tietystä toteutuksesta. Käyttöön voidaan toimittaa mikä tahansa olio, joka vastaa rajapintaa.

interface Mailer { send(to: string, body: string): void; }
class SmtpMailer implements Mailer {
  send(to: string, body: string) { console.log("SMTP ->", to); }
}

Kytkentä koostamisjuuressa

Oliograafin luovaa paikkaa kutsutaan koostamisjuureksi. Siellä valitaan konkreettiset toteutukset ja injektoidaan ne.

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");

Toteutusten vaihtaminen

Koska riippuvuuden tyyppinä on rajapinta, täysin erilainen toteutus voidaan toimittaa koskematta Notifier-luokkaan. Tämä on DI:n tarjoaman joustavuuden ydin.

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"]

Testaus ilman oikeaa I/O:ta

Testi voi testikorvikkeena käytettävän postittajan avulla tarkistaa, mitä olisi lähetetty, ilman oikeaa sähköpostia. Testi on nopea, deterministinen ja eristetty.

const fake = new FakeMailer();
new Notifier(fake).notify("test@site");
console.log(fake.sent.length === 1); // true

Useita riippuvuuksia

Ilmoittakaa niin monta riippuvuutta kuin tarvitaan. Jokainen niistä on eksplisiittinen, tyypitetty ja pakollinen, joten luokan tarpeet näkyvät yhdellä silmäyksellä.

interface Logger { log(m: string): void; }
class Notifier {
  constructor(
    private readonly mailer: Mailer,
    private readonly logger: Logger,
  ) {}
}

readonly estää uudelleenmäärittämisen

Injektoitujen kenttien merkitseminen readonly-määritteellä estää niiden vaihtamisen olion elinkaaren aikana ja pitää olion yhteistyökomponentit vakaina ja ennakoitavina.

class Notifier {
  constructor(private readonly mailer: Mailer) {}
  // this.mailer = ... would be a compile error
}

Ei piilotettua new-kutsua

Konstruktorin injektointia käyttävän luokan ei pitäisi luoda yhteistyökomponenttejaan sisäisesti new-operaattorilla. Kaikki riippuvuudet saapuvat konstruktorin kautta, joten kytkentä pysyy näkyvänä.

Pakolliset ja valinnaiset

Pakolliset riippuvuudet kuuluvat konstruktoriin. Aidosti valinnaisille riippuvuuksille voidaan käyttää oletuksena tyhjää toteutusta, joka välitetään edelleen sisään sen sijaan, että se luotaisiin luokan sisällä.

const noopLogger: Logger = { log() {} };
new Notifier(new SmtpMailer(), noopLogger);

Hyötyjen yhteenveto

Konstruktorin injektointi tekee riippuvuudet näkyviksi, alustaa oliot täysin, mahdollistaa toteutusten vaihtamisen ja tekee testaamisesta helppoa. Se on DI:n oletustyyli hyvästä syystä.

Pikatarkistus

Tämän oppitunnin pikatarkistus.

Kertaus

Konstruktorin injektointi ilmoittaa riippuvuudet rajapinnan avulla tyypitettyinä parametreina, usein muodossa private readonly. Koostamisjuuri valitsee toteutukset ja testit välittävät testikorvikkeita. Oliot ovat aina täysin kytkettyjä, ja yhteistyökomponentit voidaan vaihtaa luokkaa muokkaamatta.

Aloita maksutta

Opi TypeScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
101
Oppitunnit
352

Usein kysytyt kysymykset

Onko oppitunti ”Riippuvuuksien injektointi konstruktorilla” ilmainen?

Kyllä – oppitunnin ”Riippuvuuksien injektointi konstruktorilla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko TypeScript Academy-kurssin, päivitä CoddyKit PROhon. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Riippuvuuksien injektointi konstruktorilla”?

Injektoikaa riippuvuudet siististi konstruktoreiden kautta. Harjoittelet TypeScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni TypeScript Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin TypeScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Riippuvuuksien injektointi konstruktorilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä TypeScript Academy-oppitunnilla?

Kyllä. Jokainen TypeScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Kontrollin kääntämisen perusteet
  2. Riippuvuuksien injektointi konstruktorilla
  3. DI-kontit InversifyJS:llä
  4. Tyyppiturvalliset palvelutunnisteet
← Takaisin: TypeScript Academy