0Pricing
TypeScript Academy · Lezione

Basi dell’inversione del controllo

Comprenda perché e quando invertire le dipendenze.

Basi dell’inversione del controllo è una lezione TypeScript Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento TypeScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso TypeScript Academy include 4 lezioni in totale.

Dipendenze create direttamente nel codice

Quando una classe crea autonomamente i propri collaboratori con new, è fortemente accoppiata a quei tipi concreti. Questo rende la classe difficile da riconfigurare e da testare.

Un esempio fortemente accoppiato

In questo caso il servizio crea il proprio logger. Non è possibile sostituire il logger con uno diverso senza modificare la classe.

class ConsoleLogger { log(m: string) { console.log(m); } }
class OrderService {
  private logger = new ConsoleLogger(); // hard-coded
  place() { this.logger.log("order placed"); }
}
new OrderService().place();

Che cos'è l'inversione del controllo?

Inversione del controllo (IoC) stabilisce in modo diverso chi decide quali dipendenze usare. Invece di crearle, una classe le riceve da qualcosa di esterno. La classe dichiara ciò di cui ha bisogno e lo riceve.

Iniezione delle dipendenze

Iniezione delle dipendenze (DI) è il modo più comune per ottenere l'IoC: si passano i collaboratori dall'esterno invece di costruirli internamente. Chi effettua la chiamata controlla quale implementazione utilizzare.

La versione con le dipendenze iniettate

Ora il logger viene fornito dall'esterno. Il servizio non sa più quale logger concreto abbia ricevuto e non se ne preoccupa.

class OrderService {
  constructor(private logger: { log(m: string): void }) {}
  place() { this.logger.log("order placed"); }
}
new OrderService(new ConsoleLogger()).place();

Perché IoC migliora la testabilità

Poiché le dipendenze provengono dall'esterno, i test possono passare fake o spy. È possibile verificare il comportamento senza I/O reale, database o chiamate di rete.

const calls: string[] = [];
const fakeLogger = { log: (m: string) => calls.push(m) };
new OrderService(fakeLogger).place();
console.log(calls); // ["order placed"]

Dipendere dalle astrazioni

L'IoC funziona meglio quando le classi dipendono da un'interfaccia anziché da una classe concreta. È possibile iniettare qualsiasi implementazione che soddisfi l'interfaccia.

interface Logger { log(m: string): void; }
class OrderService {
  constructor(private logger: Logger) {}
}

Iniezione tramite costruttore

L'iniezione tramite costruttore passa le dipendenze come parametri del costruttore. Sono disponibili immediatamente e possono essere contrassegnate come readonly, rendendole chiare e obbligatorie.

class OrderService {
  constructor(private readonly logger: Logger) {}
}

Iniezione tramite proprietà

L'iniezione tramite proprietà imposta una dipendenza su una proprietà pubblica o modificabile dopo la costruzione. È più flessibile, ma consente all'oggetto di esistere temporaneamente senza la dipendenza.

class OrderService {
  logger!: Logger; // set after construction
  place() { this.logger.log("placed"); }
}
const s = new OrderService();
s.logger = new ConsoleLogger();

Scegliere uno stile

È preferibile usare l'iniezione tramite costruttore per le dipendenze obbligatorie, perché l'oggetto non si trova mai in uno stato parzialmente costruito. Si può usare l'iniezione tramite proprietà per i collaboratori facoltativi o per interrompere cicli di costruzione.

Anteprima dei container IoC

Nelle app di grandi dimensioni, configurare manualmente le dipendenze diventa tedioso. Un container IoC automatizza la creazione e la fornitura delle dipendenze; le prossime lezioni lo esploreranno con InversifyJS.

Verifica rapida

Una breve verifica su questa lezione.

Riepilogo

L'inversione del controllo sposta la creazione delle dipendenze all'esterno della classe; l'iniezione delle dipendenze le fornisce alla classe. Si utilizzino le interfacce come dipendenze, si preferisca l'iniezione tramite costruttore per le dipendenze obbligatorie e si ottengano test semplici iniettando fake.

Domande Frequenti

La lezione «Basi dell’inversione del controllo» è gratuita?

Sì — il testo completo di «Basi dell’inversione del controllo» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso TypeScript Academy, passa a CoddyKit PRO. Il corso TypeScript Academy include 4 lezioni in totale.

Cosa imparerò in «Basi dell’inversione del controllo»?

Comprenda perché e quando invertire le dipendenze. Eserciti TypeScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare TypeScript Academy?

Non è richiesta alcuna esperienza precedente. TypeScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Basi dell’inversione del controllo»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione TypeScript Academy?

Sì. Ogni lezione TypeScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Basi dell’inversione del controllo
  2. Dependency injection tramite costruttore
  3. Container DI con InversifyJS
  4. Token di servizio type-safe
← Torna a TypeScript Academy