Recentemente ho chiesto di fare correttamente DI, e ho ottenuto alcuni collegamenti ai post del blog su di esso. Penso di avere una migliore comprensione ora - separare la costruzione di oggetti dalla logica, inserendola nelle fabbriche. Ma tutti gli esempi sono per cose come i siti web e dicono di fare tutto il cablaggio all'avvio. Chiama una grande fabbrica che è la new
s e passa tutte le dipendenze.Quando e dove chiamare le fabbriche in fase di runtime?
Ma cosa succede se non voglio istanziare tutto in anticipo? Ho un oggetto che contiene un elenco di altri oggetti a cui è possibile delegare, ma sono costosi e usati uno alla volta, quindi li costruisco quando è necessario e li raccolgo quando ho finito. Non voglio inserire new B()
nella logica di A
perché preferirei usare DI - ma come? A
può chiamare la fabbrica? Non sembra molto meglio, a meno che la fabbrica non mantenga lo stato, comprese le dipendenze attuali. Solo non voglio passare l'elenco completo di B
s a A
quando è stato costruito, poiché sarebbe uno spreco. Se si desidera, B
non necessariamente devono essere dentro A
, anche se ha un senso logico (A
è un livello di gioco, B
è un singolo schermo), ma in ogni caso la logica della A
impone quando si crea B
.
Quindi, chi chiama la fabbrica per ottenere B
e quando?
Chiarimento: Non sto utilizzando framework per DI. Mi chiedo se il termine DI lo sottintenda?
grande domanda. Sono stato anche confuso da questo problema. Inoltre, a volte voglio più istanze di qualcosa (e un numero arbitrario di esse in quel caso!) E sono stato molto confuso su come dovrebbe funzionare. Con Ninject ho appena risucchiato e iniettato 'IKernel', ma mi viene dato di capire che è disapprovato. (anche se, secondo la mia esperienza, è molto potente e devo ancora rimpiangere - e no, non sono nemmeno lontanamente interessato a "scambiare" il mio framework DI, quindi il vantaggio mi viene in mente) –
E 'solo disapprovato dagli sviluppatori che avere qualche comprensione religiosa dei modelli. Anche se non andrei in giro selvaggio dove ogni tipo sa di IKernel, o qualunque sia il suo nome nel tuo framework DI, a volte questo è il modo migliore per andare. Ho fatto anche questo, e nulla è esploso su di me. – Andy