I miei due centesimi qui:
Sto refactoring di un'applicazione php e sto provando a fare l'iniezione di dipendenza il più possibile
Non dichiari se stai usando un framework di iniezione di dipendenza. Penso che dovresti assolutamente. Usa qualcosa che ti offre le funzionalità di cui hai bisogno: /programming/9348376/guice-like-dependency-injection-frameworks-in-php .
Il problema che ho riscontrato ora è a che punto posso effettivamente creare nuovi oggetti? Sembra che finirò in una classe di alto livello, creando un sacco di nuovi oggetti in quanto non c'è altro posto dove andare. Questo sembra sbagliato.
Normalmente si utilizza la configurazione o un punto centrale per l'istanza degli oggetti iniziali che compongono l'applicazione. Il contenitore creerà gli oggetti per te.
Quindi accedi agli oggetti (servizi, provider, controller ...) tramite il contenitore IoC. Creerà in modo trasparente un oggetto per te, se necessario, o ti darà un riferimento all'istanza esistente appropriata.
Ovviamente, all'interno della tua particolare implementazione di oggetti puoi istanziare altri oggetti su cui non hai bisogno di DI (strutture dati, tipi personalizzati, ecc.), Ma questa è una normale programmazione.
Ho letto alcuni blog che usano le classi factory per creare tutti gli oggetti, e quindi si inietta la factory in altre classi. È quindi possibile chiamare i metodi factory e factory crea il nuovo oggetto per te.
Normalmente, usi una Factory se vuoi che il framework IoC crei un'istanza di alcuni oggetti IoC attraverso le tue fabbriche (questo è necessario quando si crea un'istanza di un oggetto particolare richiede del lavoro extra). Se puoi semplicemente creare i tuoi oggetti con "new Object ()" e impostare alcune proprietà, non devi necessariamente usare un modello Factory.
In altre parole, direi che l'utilizzo di un modello Factory per una classe o un gruppo di classi dipende dal modo in cui si desidera modellare quelle classi, non dal fatto che si utilizzi DI (a meno che l'implementazione DI non richieda esplicitamente fabbriche, il che è insolito).
Configura anche il tuo framework IoC per usare una Factory quando stai usando una libreria di terze parti che richiede già l'uso di una Factory. In questo caso non hai alcun controllo su questo e devi dire al tuo contenitore IoC: "hey, quando chiedo una di queste interfacce, devi usare questa fabbrica per fornirmi un'istanza appropriata".
La mia preoccupazione nel farlo è che ora le mie lezioni di fabbrica saranno un nuovo gioco per tutti! Immagino che questo potrebbe andare bene in quanto sono classi di fabbrica, ma ci sono alcune regole a cui attenersi quando si usano il modello di fabbrica e DI, o sto andando lontano dal segno qui.
In questo caso, sembra che non sia necessario utilizzare i pattern Factory per questi oggetti / servizi / controller / qualunque cosa, e puoi semplicemente configurare il tuo IoC per creare un'istanza con "nuovo" la classe appropriata e iniettare tutto il resto.
Spero possa essere d'aiuto.