Le mie domande riguardano specificamente l'iniezione delle dipendenze attraverso il costruttore. Comprendo i pro / contro del modello di localizzatore di servizi, dell'iniezione costruttore / setter e dei loro aromi, tuttavia c'è qualcosa che non riesco a superare dopo aver scelto l'iniezione pura del costruttore. Dopo aver letto molti materiali per il design verificabile, incluso un approfondito esame del blog di Miško Hevery (in particolare questo post) Sono nella seguente situazione:
Supponiamo che io stia scrivendo un programma C ++ e ho iniettato correttamente le mie dipendenze attraverso i loro costruttori. Per la leggibilità mi sono dato un oggetto di alto livello che ha una singola funzione Execute () chiamata da main:
int main(int argc, char* argv[]) {
MyAwesomeProgramObject object(argc, argv);
return object.Execute();
}
La responsabilità di Execute () è di collegare semplicemente tutti gli oggetti richiesti e dare il via all'oggetto di livello più alto. L'oggetto di livello più alto richiede un paio di dipendenze e quegli oggetti richiedono alcuni oggetti e così via e così via, implicando una funzione simile a questa:
MyAwesomeProgramObject::Execute() {
DependencyOne one;
DependencyTwo two;
DependencyThree three;
MidLevelOne mid_one(one);
MidLevelTwo mid_two(two, three);
// ...
MidLevelN mid_n(mid_dependencyI, mid_dependencyJ, mid_dependencyK);
// ...
HighLevelObject1 high_one(mid_one, mid_n);
HighLevelObject2 high_two(mid_two);
ProgramObject object(high_one, high_two);
return object.Go();
}
Da quello che prendo dal blog di Miško (e glielo chiedo, ma ho pensato che non avrebbe avuto il tempo di tornare da me), questo è l'unico modo per soddisfare l'iniezione pura delle dipendenze del costruttore.
Nel post del blog menzionato , afferma che dovremmo avere fabbriche su un livello di vita per oggetto, ma questo è essenzialmente ciò che Execute sta facendo, rendendo il mio codice simile al suo esempio:
AuditRecord audit = new AuditRecord();
Database database = new Database(audit);
Captcha captcha = new Captcha();
Authenticator authenticator =
new Authenticator(database, captcha, audit);
LoginPage = new LoginPage(audit, authenticator);
Domande:
- È questo l'approccio standard?
- Si tratta di un pattern di cui non sono a conoscenza (sembra simile al contesto.xml di Maven)?
- Per l'iniezione pura del costruttore, devo semplicemente subire il costo dell'allocazione "anticipata"?