Ho una base di codice di grandi dimensioni con molti singleton "anti-pattern", classi di utilità con metodi statici e classi che creano le proprie dipendenze usando la new
parola chiave. Rende molto difficile testare un codice.
Voglio migrare gradualmente il codice nel contenitore di iniezione delle dipendenze (nel mio caso Guice
, perché è un GWT
progetto). Dalla mia comprensione dell'iniezione di dipendenza, è tutto o niente. O tutte le classi sono gestite da Spring / Guice o nessuna. Poiché la base di codice è grande, non riesco a trasformare il codice durante la notte. Quindi ho bisogno di un modo per farlo gradualmente.
Il problema è che quando inizio con una classe che deve essere iniettata in altre classi, non posso usare un semplice @Inject
in quelle classi, perché quelle classi non sono ancora gestite dal contenitore. Quindi questo crea una lunga catena fino alle classi "top" che non vengono iniettate da nessuna parte.
L'unico modo che vedo è di rendere un Injector
contesto / application globalmente disponibile attraverso un singleton per il momento, in modo che altre classi possano ottenere un bean gestito da esso. Ma contraddice l'idea importante di non rivelare composition root
l'applicazione.
Un altro approccio sarebbe dal basso verso l'alto: iniziare con classi "di alto livello", includerle nel contenitore di iniezione di dipendenza e spostarsi lentamente verso le classi "più piccole". Ma poi devo aspettare molto tempo, dal momento che posso testare quelle classi più piccole che dipendono ancora dai globali / statici.
Quale sarebbe il modo per ottenere una migrazione così graduale?
PS La domanda L'approccio graduale all'iniezione di dipendenza è simile nel titolo, ma non risponde alla mia domanda.