Meglio iniettare il contenitore IoC o utilizzare un modello di localizzazione del servizio? [duplicare]

3

Ho un contenitore IoC (se vuoi uno specifico da guardare, è molto simile a Unity) e sto lavorando su come voglio integrarlo nella mia applicazione. Il mio obiettivo generale per questo esercizio è trasformare questo codice orrendo che ho scritto in qualcosa di molto più testabile.

Posso creare il contenitore IoC e registrare i tipi e capisco i fondamenti di come dovrebbe raggiungere il suo obiettivo. La mia domanda è se dovessi iniettare il contenitore in oggetti che ne hanno bisogno, o se gli oggetti che ne hanno bisogno lo cercano usando uno schema di localizzazione del servizio? Realisticamente mi vedo dover fare riferimento al contenitore in due o tre strati della mia applicazione.

    
posta Andrew 07.04.2011 - 17:58
fonte

1 risposta

2

Piuttosto che iniettare il contenitore nel tuo oggetto e fare in modo che i tuoi oggetti usino il contenitore iniettato, dovresti fare in modo che il contenitore inietti i parametri (dipendenze) nel costruttore dei tuoi oggetti.

Questo approccio rende molto semplice testare il codice in quanto si può fare in modo che il contenitore si occupi delle dipendenze nel codice, ma nel test è possibile creare un'istanza dell'oggetto stesso e iniettarlo con oggetti finti o falsi, se necessario.

Inoltre, in questo modo non è necessario risolvere manualmente tutte le dipendenze nel codice e lasciare che il contenitore si occupi di questo lavoro.

L'implementazione di questa tecnica dipende dal contenitore in uso ma normalmente può iniettare argomenti del costruttore.

Ad esempio, in MEF (Microsoft Extensibilty Framework) è possibile utilizzare l'attributo [ImportingConstructor]. È anche fattibile a Windsor (dal progetto Castle), Unity e altri contenitori.

EDIT: Se per qualche motivo non è possibile passare parametri al costruttore, questo approccio non può essere utilizzato. In tal caso, utilizzerei il modello Service Locator e ho un Localizzatore di servizio statico utilizzato nell'applicazione.

    
risposta data 07.04.2011 - 19:08
fonte