Un contenitore IoC è in genere utile per iniettare oggetti che hanno stato; o classi o interfacce che hanno più di una implementazione, anche se la seconda implementazione è una simulazione a scopo di test. Se nessuno di questi è vero, non ottieni nulla iniettandolo.l'idioma più comune in questi giorni è quello di far fronte alla tua classe tramite un'interfaccia che l'implementazione reale e simulata può implementare.
1) Metodi statici sulle classi di supporto - No, questi non vengono spesso iniettati da IoC. Tipicamente sono utilità stateless.
Per utilizzare un esempio molto semplice, non sono necessarie due versioni di un metodo di utilità chiamato StringUtils.Reverse()
. Ne hai bisogno solo uno, e puoi facilmente scrivere dei test su di esso perché non ha stato o dipendenze, quindi non c'è assolutamente alcun vantaggio nel prenderlo in giro. Test Esempio:
string reversedString = StringUtils.Reverse("input");
Assert.AreEqual("tupni", reversedString)
Se l'utilità non è davvero senza stato (ad esempio, dipende HttpContext.Current), allora si dovrebbe fare la dipendenza esplicita per iniezione, e non fare l'utilità statica.
2) Singletons: Spesso sì, vengono iniettati singleton. Ma una cosa positiva di IoC è che ti preoccupi di meno se c'è solo una cosa o meno. Ottieni flessibilità nell'istanziamento utilizzando IoC. La decisione di avere un tipo particolare come singleton o nuova istanza ogni volta diventa parte della configurazione del contenitore IoC e nient'altro nel codice deve essere modificato.
Quindi il singleton-cappa smette di essere un problema separato che deve essere codificato nella classe (e le classi che hanno più problemi quando non devono necessariamente è cattivo), e diventa la preoccupazione del contenitore IoC. Non codifichi la classe "come un singleton" con qualcosa di speciale come un costruttore privato e un metodo , basta codificarlo per il problema principale, mentre la configurazione del contenitore IoC specifica se è un singleton o no, o da qualche parte in mezzo, come un'istanza per thread.
3) Classi statiche - sono la sede naturale per i metodi statici. Prendi in considerazione l'idea di rendere i metodi di estensione dei metodi statici, ove appropriato. Non è possibile iniettare queste classi, poiché non è possibile crearle. L'uso di classi statiche rende il codice procedurale non orientato agli oggetti. Questa non è una brutta cosa per i piccoli metodi di supporto, ma se la maggior parte del codice è così, allora non stai usando le potenti funzionalità OO della piattaforma .Net.
grazie Bryan - Ciò significa che potrebbe esserci un po 'più di overhead del CIO che costruisce cose (ad esempio logger) ogni volta? Anche per le classi di tipi di utils, mi chiedo, questo renderà più difficile il refactoring mentre si refactoring le funzioni di supporto tra le classi di helper? (Sto usando ReSharper da solo) - grazie – Greg
La maggior parte dei contenitori IoC consente una sorta di scoping. Con ciò intendo che si indica se il proprio oggetto viene creato ogni volta (factory), creato una volta per contesto (unità di lavoro) o una volta per applicazione (singleton). Ciò significa che è possibile registrare il registratore in modo che venga creato una sola volta. –
In definitiva si desidera eliminare le classi di utilità. Ogni metodo su ciascuna di queste classi ha gli stessi problemi di accoppiamento del metodo 'HttpUtils.DoStuff' qui sopra. Per questo motivo, non si vuole richiedere che * qualsiasi * codice dipenda direttamente dai membri 'static'. Invece, prendi il corpo di 'HttpUtils.DoStuff', mettilo dietro 'IDoesStuff', ed elimina il metodo interamente da' HttpUtils'. Ora, qualsiasi classe che possa aver chiamato il metodo statico può invece accettare 'IDoesStuff' nel suo costruttore. Viola: non serve più per la classe di utilità! –