IOC in fase di compilazione


11

Qualcuno ha avviato un progetto per eseguire il CIO al momento della compilazione (eventualmente utilizzando Roslyn o Linq MethodInfo emit)?

La mia esperienza con i contenitori IOC è stata finora eccezionale, rilevando alcuni piccoli problemi

  1. Molti contenitori IOC sono lenti all'avvio, poiché gran parte della logica di risoluzione si verifica qui
  2. Spesso è difficile garantire che la risoluzione sia possibile, poiché la compilazione non garantisce più che il costruttore possa essere chiamato
  3. Spesso i contenitori IOC aggiungono un piccolo sovraccarico al runtime (alcuni non sono nemmeno piccoli, spesso quelli che si avviano rapidamente funzionano lentamente)

Mi sembra che la soluzione ideale sarebbe quella di aggiungere un passo di compilazione alla catena di build che aggiunge una classe Factory anziché IOC.

Qualcuno l'ha già fatto? In caso contrario, perché no?

Risposte:


4

In questo modo non dovrebbe essere un problema. Basta eseguire la stessa logica IoC e invece di creare un'istanza delle classi, si emette il codice che esegue l'istanza.

Ma facendo questo, stai rimuovendo un enorme vantaggio di IoC: la possibilità di cambiare il modo in cui sono composti i coponenti senza dover ricompilare l'intera applicazione. Semplicemente sostituendo la configurazione, è possibile fare in modo che l'applicazione utilizzi servizi o origini dati diversi. E mentre devo ancora vedere un'applicazione che sfrutterà appieno questa capacità, è ancora una parte importante del successo di IoC.


Sì, lo so che è possibile. Ma devo ancora vedere un contenitore IoC che lo fa. Inoltre, ho notato che l'attuale tendenza sembra essere verso la registrazione nel codice (API fluenti). Detto questo, sto pensando di scrivere detto contenitore IoC.
Art

Mi sembra di ricordare che Hiro ( github.com/philiplaureano/Hiro ) potrebbe fare le sue cose in fase di compilazione.
lzcd

2
"Ma facendo questo, stai rimuovendo un enorme vantaggio di IoC: la possibilità di cambiare il modo in cui sono composti i coponenti senza dover ricompilare l'intera applicazione." Mi sembra che applicare questo all'intera applicazione sia eccessivo; stai trasformando ogni parte dell'applicazione in un plug-in. Inoltre, entrambe le tecniche dovrebbero poter coesistere: non c'è motivo per cui non è possibile collegare alcuni dei componenti in fase di compilazione e alcuni in fase di esecuzione.
Doval,

Non vedo come sia un enorme vantaggio. In quale contesto stai sostituendo completamente i componenti in fase di esecuzione? Qualche caso d'uso di configurazione forse?
Andyczerwonka,

4

Dagger per Java / Android lo fa. Sacrifica alcune magie di runtime (come quelle di Guice) per offrire un'esperienza di codegen quasi completamente in fase di compilazione, inclusa la conversione della maggior parte degli errori di runtime in errori di compilazione.

Sarebbe bello anche in .NET.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.