Ho una grande base di codice con un sacco di singleton "anti-pattern", classi di utilità con metodi statici e classi che creano le proprie dipendenze usando la parola chiave new
. Rende molto difficile testare un codice.
Voglio migrare gradualmente il codice al contenitore di input delle dipendenze (nel mio caso è Guice
, perché è un progetto GWT
). Dalla mia comprensione dell'iniezione di dipendenza, è tutto o niente. Tutte le classi sono gestite da Spring / Guice o none. Poiché il codebase è grande, non posso 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 contesto Injector
/ application globalmente disponibile attraverso un singleton per il momento, in modo che altre classi possano ottenere da esso un bean gestito. Ma contraddice l'idea importante di non rivelare il composition root
all'applicazione.
Un altro approccio sarebbe di tipo bottom-up: per iniziare con le classi "di alto livello", includerle in un contenitore per le dipendenze e passare lentamente alle classi "più piccole". Ma poi devo aspettare molto tempo, dal momento che posso testare quelle classi più piccole che dipendono ancora da globali / statici.
Quale sarebbe il modo per ottenere una migrazione graduale?
P.S. La domanda Approcci graduali all'iniezione di dipendenza è simile nel titolo, ma non risponde alla mia domanda.