2012-03-15 16 views
6

Qual è il modo corretto di fare quanto segue in modo che ParentClass non dipenda da MyClass?Iniezione di dipendenze in un loop

public class ParentClass 
{ 
    public void MyFunction(IList<Foo> foos) 
    { 
     foreach (var bar in foos) 
     { 
      var myClass = new MyClass(); 
      myClass.DoStuff(); 
     } 
    } 
} 

normalmente senza un ciclo avevo appena iniettare con il costruttore ParentClass, ma qui ho bisogno di una nuova istanza per ogni iterazione del ciclo.

O forse c'è un modo migliore per fare ciò che sto cercando di ottenere? Forse myClass potrebbe resettarsi alla fine di ogni iterazione in modo che possa riutilizzarlo?

+0

Quindi, perché non definire una raccolta di oggetti o semplicemente definire DoStuff come statico mentre si crea una nuova istanza e buttarli via immediatamente. –

risposta

7

È possibile iniettare un oggetto factory che crea istanze MyClass in ParentClass.

Per ogni iterazione del ciclo, si chiama l'oggetto factory in modo da fornire una nuova istanza di MyClass.

+1

Come si crea un oggetto all'interno della fabbrica quando l'oggetto ha un'ulteriore dipendenza? In questo caso, dobbiamo iniettare il contenitore stesso in fabbrica. Vedo due avvertenze qui: iniettare il contenitore e usare il contenitore. Risolvi (localizzatore di servizio). È raccomandato? Qualche altro approccio? – hungryMind

+0

Questa è una buona domanda, @hungryMind, penso che dovresti promuoverlo come una vera domanda in SO e collegarlo a questo. Ad ogni modo, ho trovato questo articolo che fornisce alcune opzioni: http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/ – Fabio

1

È possibile iniettare un Func<IMyClass> nel costruttore, quindi richiamarlo tutte le volte che si desidera ottenere istanze diverse.

I framework IoC come Autofac supportano questo in modo nativo.

+0

Sono d'accordo con te. Vorrei comunque suggerire di non utilizzare alcun contenitore IoC finché non diventa necessario: DTSTTCPW (Il più semplice pensa che possa funzionare) – Skyp

+0

@Skyp "Più semplice" è un concetto vago senza avere obiettivi o obiettivi. Se il test unitario è un obiettivo, utilizzare IoC è una delle cose più semplici che potrebbero funzionare. –

0

Dipende davvero da cosa si vuole fare con MyClass. Allo stato attuale, non vi è alcuna correlazione tra foo's, bar e MyClass. Supponendo che si debba iniettare una barra nel Ctor di MyClass, o passarla come parametro a DoStuff, allora semplicemente inserirò una classe factory o un metodo nel ParentClass Ctor e lo useremo al posto di new-up su MyClass.

0

L'iniezione proposta è leggibile, comprensibile e facile da verificare per la correttezza.

Il ripristino dell'oggetto è un'opzione se il loop è di grandi dimensioni o se MyClass è costoso da creare (ad esempio apre una connessione, un handle di file, un sottoprocesso o avvia un thread).

Poiché la soluzione reset() richiede più tempo e concentrazione per verificare su ciascuna modifica del codice, consiglio di misurare effettivamente che si tratta di un collo di bottiglia prima di preoccuparsi.

Problemi correlati