2012-11-06 12 views
13

Che cosa è DI per e qual è il suo caso d'uso, quando abbiamo ServiceManager?Zend Di vs contenitori di dipendenza dipendenza ServiceManager

sembrano essere simili in quanto nei file di configurazione sia per zend-di e zend-servicemanager possiamo impostare alcune opzioni come aliases e invokables.

Sto cercando di capire meglio cosa sta succedendo dietro le quinte con questi componenti e la documentazione non mi ha dato abbastanza informazioni.

Potrebbe per favore dirmi qual è la differenza e quando dovrei usare Di invece di ServiceManager?

+0

C'è una buona discussione su contenitori in genere su http://www.php-fig.org/psr/psr-11/meta/ – Dennis

+0

i consigli moderni sembrano essere "non usare DI o SM" da soli, a meno che non siano già parte del tuo framework. Zend utilizza il Service Manager basato sulla fabbrica (che è essenzialmente un contenitore DI limitato), dove devi fare attenzione a * non * iniettare qualsiasi contenitore in una delle tue classi, ma puoi usare il contenitore come parte della configurazione del tuo applicazione. Ad esempio, in Zend puoi utilizzare le strutture del framework stesso per personalizzare il modo in cui le tue dipendenze sono cablate. Alcuni esempi recenti sono qui: https://docs.zendframework.com/tutorials/getting-started/database-and-models/ – Dennis

risposta

15

Zend \ DI fa affidamento su magie, come i riflessi, per rilevare e iniettare dipendenze mentre il gestore servizi utilizza le fabbriche fornite dall'utente. Questa è la differenza principale.

Di sorta di deprecato in comunità a favore di SM a causa di problemi di complessità, debug e prestazioni. Si suppone che sia buono per RAD, ma è necessaria una conoscenza superiore alla media per usarlo correttamente.

D'altra parte SM ha un cablaggio piuttosto dettagliato ed esplicito, è possibile aprire il codice dopo un anno e capire facilmente cosa sta succedendo.

+1

Questa è una buona risposta, ricordo che utilizzo DI in anticipo e non tornerei a usarlo . – DrBeza

+0

vuol dire che potrei rifiutarmi di usare di e sm farà il lavoro? – user1650441

+0

Esattamente come ha fatto notare Xerkus. Di-Stuff è praticamente considerato deprivato, i DI-Container semplicemente sono stati eccessivamente complessi. ServiceManager risolve lo stesso problema di base in un modo molto più user-friendly. – Sam

6

Zend\Di si occupa di collegare le lezioni insieme, mentre con Zend\ServiceManager è necessario collegare le cose manualmente e scrivere una chiusura di fabbrica per ogni classe che si desidera creare.

Zend\ServiceManager è molto più veloce poiché non si basa sul lento Reflection API. D'altra parte, scrivere chiusure per grandi applicazioni con centinaia di classi diventa molto noioso. Mantenere aggiornate le vostre chiusure diventerà più complicato man mano che la vostra applicazione cresce.

Per risolvere questo problema, ho scritto un modulo Zend Framework 2 chiamato ZendDiCompiler. Si affida a Zend\Di per eseguire la scansione del codice e genera automaticamente il codice factory per creare un'istanza delle classi. Ottieni il meglio da entrambi i componenti: la potenza di Zend\Di e le prestazioni di Zend\ServiceManager.

Ho messo un bel po 'di lavoro nella documentazione di ZendDiCompiler e sono forniti anche alcuni esempi di utilizzo semplici e avanzati.

0

Fondamentalmente la differenza è il seguente:

  • Zend\ZerviceManager = fabbrica guidato IoC Container
  • Zend\Di = autowiring IOC attuazione

Zend\Di stata riscritta per la versione 3. Il suo comportamento ora più solido e prevedibile rispetto alla v2 ed è progettato per integrarsi perfettamente in zend-servicemanager per fornire funzionalità di auto-cablaggio (non più magie strane). Dal momento che utilizza l'API di riflessione di PHP per risolvere le dipendenze, è più lento di un approccio guidato dalla fabbrica. Pertanto la versione 3 viene fornita con un compilatore AoT per creare un iniettore pre-risolto che omette l'uso di Reflection. Un ulteriore vantaggio: le fabbriche generate possono essere utilizzate anche con Zend\ServiceManager direttamente.

C'è una guida per l'utilizzo AoT con entrambe le componenti: https://zendframework.github.io/zend-di/cookbook/aot-guide/