Ho letto So Singletons sono cattivi, allora cosa? che è stata una grande spiegazione dell'iniezione di dipendenza come soluzione per inversione di controllo. Il presupposto assunto singleton e single instance erano sinonimi e, come altri hanno sottolineato singleton, è un esempio più restrittivo di istanza singola.
La mia domanda è: perché il rispondente è passato da una singola istanza a parlare di un'iniezione di dipendenza? Dichiara:
A cache does not need to be a singleton. It may need to be a single instance if you want to avoid fetching the same data for multiple cache instances; but that does not mean you actually have to expose everything to everyone.
Con DI, hai un'interfaccia, in questo caso "Cache". Tuttavia, hai più istanze. Istanze di VideoPage
+ istanze di MyAccountPage
+ ecc. VideoPage
implementa IMediaCache
che estende Cache
. Il DI è che la classe dipendente che fa uso di questa astrazione di caching lo fa utilizzando l'interfaccia Cache
come un tipo in un elenco di parametri (elenco di parametri del costruttore se si utilizza l'iniezione del costruttore, ecc.)
Quindi ci sono più istanze ( x VideoPages
, y MyAccountPages
, ecc.) La Cache è la cosa "singola" in questo modello di progettazione, ma non è un'istanza dato che non è possibile creare un'istanza di un'interfaccia.
"Single instance" e "Dependency Injection" sono idee separate, quindi la risposta mi ha confuso.
Inoltre non so perché la gente dice che l'iniezione di dipendenza è un'alternativa ai singleton. Un singleton forza un'istanza anche se provo a istanziare di nuovo. Per quanto riguarda l'iniezione di dipendenza, di nuovo, qual è la mia "singola istanza"? Il Cache
non è, come ho spiegato prima. E ci sono più istanze di classi che in definitiva implementano l'interfaccia Cache
.