I miei due centesimi qui:
I am refactoring a php application and I am trying to do has much
dependency injection as possible
Non si specifica se si sta utilizzando un'infrastruttura per le dipendenze. Penso che dovresti assolutamente. Usa qualcosa che ti offre le funzionalità di cui hai bisogno: link .
The problem I have now run into is at what point can I actually create
new objects? Its looking like I'll end up at a top level class,
creating loads of new objects as there is no where else to go. This
feels wrong.
Normalmente usi la configurazione o un punto centrale per l'istanziazione degli oggetti iniziali che compongono la tua applicazione. Il contenitore creerà gli oggetti per te.
Quindi accedi agli oggetti (servizi, provider, controllori ...) tramite il contenitore IoC. Creerà in modo trasparente un oggetto per te, se necessario, o ti fornirà un riferimento all'istanza esistente appropriata.
Naturalmente, all'interno della tua particolare implementazione di oggetti puoi istanziare altri oggetti su cui non hai bisogno DI (strutture dati, tipi personalizzati, ecc.), ma è normale programmazione.
I've read some blogs that use factory classes to create all the
objects, and then you inject the factory into other classes. You can
then call the factory methods, and the factory creates the new object
for you.
Normalmente, usi una Fabbrica se vuoi che la struttura IoC istanzia da alcuni oggetti IoC attraverso le tue fabbriche (questo è necessario quando l'istanziazione di un particolare oggetto richiede un lavoro extra). Se puoi semplicemente creare i tuoi oggetti con "nuovo oggetto ()" e impostando alcune proprietà, non devi necessariamente utilizzare un modello di fabbrica.
In altre parole, direi che l'utilizzo di un pattern Factory per una classe o un gruppo di classi dipende da come si desidera modellare tali classi, non dal fatto che si utilizzi DI (a meno che l'implementazione DI richieda esplicitamente le fabbriche, che è insolito).
Configura anche il tuo framework IoC per usare una Factory quando usi una lib di terze parti che già richiede 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".
My concern with doing this is now my factory classes are going to be a
new free-for-all! I guess this may be ok as they are factory classes,
but are there some rules to stick to when using factory pattern and
DI, or am I going way off the mark here.
In questo caso, sembra che non sia necessario utilizzare modelli di fabbrica per questi oggetti / servizi / controller / qualsiasi cosa, e puoi semplicemente configurare il tuo IoC per creare un'istanza con "nuova" la classe appropriata e iniettare tutto il resto.
Spero che aiuti.