Ci sono molte domande sul fatto che i singleton siano "cattivi" e quali modelli usare al loro posto. Generalmente sono focalizzati sul modello di progettazione singleton, che implica il recupero dell'istanza singleton da un metodo statico sulla classe. Questa non è una di quelle domande.Sto usando Dependency Injection: quali tipi devo associare come single?
Da quando ho davvero "scoperto" l'iniezione di dipendenza diversi mesi fa, ho guidato la sua adozione nel nostro team, rimuovendo i modelli statici e singleton dal nostro codice nel tempo e utilizzando l'iniezione basata sul costruttore laddove possibile. Abbiamo adottato le convenzioni in modo da non dover continuare ad aggiungere collegamenti espliciti ai nostri moduli DI. Usiamo anche il framework DI per fornire istanze di logger, in modo che possiamo dire automaticamente a ogni logger quale classe è presente senza codice aggiuntivo. Ora che ho un singolo posto in cui posso controllare come sono legati i vari tipi, è davvero facile determinare quale dovrebbe essere il ciclo di vita di una particolare categoria di classi (classi di utilità, archivi, ecc.).
Il mio pensiero iniziale era che probabilmente ci sarebbero stati dei vantaggi rispetto alle classi vincolanti come singleton se mi aspettassi che fossero usati abbastanza spesso. Significa solo che c'è molto meno in attività new
, specialmente quando l'oggetto che stai creando ha una grande struttura di dipendenze. Praticamente i soli campi non statici su ognuna di queste classi sono quei valori che vengono iniettati nel costruttore, quindi c'è un sovraccarico di memoria relativamente piccolo per mantenere un'istanza intorno quando non viene utilizzata.
Poi ho letto "Singleton ti amo, ma mi stai portando giù" su www.codingwithoutcomments.com, e mi sono chiesto se avessi avuto l'idea giusta. Dopotutto, Ninject compila le funzioni di creazione dell'oggetto per impostazione predefinita, quindi c'è un piccolo overhead di riflessione coinvolto nella creazione di istanze aggiuntive di questi oggetti. Poiché stiamo mantenendo la business logic fuori dal costruttore, la creazione di nuove istanze è un'operazione davvero leggera. E gli oggetti non hanno un mucchio di campi non statici, quindi non ci sono molti overhead di memoria coinvolti nella creazione di nuove istanze.
Quindi, a questo punto, sto iniziando a pensare che probabilmente non avrà molta importanza in entrambi i casi. Ci sono ulteriori considerazioni che non ho preso in considerazione? Qualcuno ha effettivamente sperimentato un miglioramento significativo delle prestazioni modificando i cicli di vita di determinati tipi di oggetti? Seguire il pattern DI è l'unica cosa veramente importante, o ci sono altri motivi per cui l'uso di una singola istanza di un oggetto può essere intrinsecamente "cattivo?"
+1 per rispondere alla domanda che è stata posta. – StriplingWarrior