Iniezione delle dipendenze e Singleton. Sono due concetti completamente diversi?

16

Ho sentito parlare dell'utilizzo dell'iniezione di dipendenza su Singleton per il mio collega. Non riesco ancora a capire se si tratta di due schemi ortogonali che possono essere sostituiti l'uno con l'altro? O è DI un metodo per rendere testabile il pattern Singleton?

Dai un'occhiata al seguente frammento di codice.

    IMathFace obj = Singleton.Instance;

    SingletonConsumer singConsumer = new SingletonConsumer(obj);

    singConsumer.ConsumerAdd(10,20);

Il SingletonConsumer accetta un parametro di tipo IMathFace . Invece di accedere internamente alla classe singleton, SingletonConsumer otterrà l'istanza singleton passata dal chiamante. Questo è un buon esempio del consumo di una classe singleton tramite l'integrazione delle dipendenze?

    
posta logeeks 23.12.2011 - 20:35
fonte

4 risposte

17

Penso che intendesse usare l'injection dependency per iniettare una singola istanza del servizio, invece di usare l'implementazione classica di Singleton con un accessor statico MySingleton.Instance .

public class MySingleton
{
    public static MySingleton Instance{get{...}};
}

Con l'implementazione classica di singleton tutto il tuo codice dipende dal fatto che il servizio sia un singleton. In pratica, codifica l'assunzione del codice in codice quando usi MySingleton.Instance .

D'altra parte con DI si ottiene un'istanza del servizio passato nel costruttore e lo si memorizza. Che ci sia solo una singola istanza di questo servizio è un dettaglio di implementazione. Puoi facilmente cambiarlo per dare al codice che consuma un'istanza diversa. In questo modo hai qualche classe / interfaccia che viene implementata da una singola istanza, invece di far rispettare l'unica istanza.

Questo è utile se per esempio si desidera un'implementazione fittizia del servizio per il test o se diverse parti del programma richiedono configurazioni diverse di quel servizio.

    
risposta data 23.12.2011 - 20:48
fonte
4

Sì, hai ragione. Invece di accedere all'oggetto tramite il singleton, stai passando un riferimento ad esso in questo modo stai utilizzando un'iniezione del costruttore.

Ciò che altri sottolineano è che queste nozioni non sono correlate. Il consumo di un'istanza singleton non è niente di speciale in quanto l'oggetto a cui si sta iniettando non si preoccupa veramente di dove proviene l'oggetto iniettato.

    
risposta data 23.12.2011 - 20:44
fonte
2

C'è un caso in cui il pattern Singleton e l'intersezione DI / IoC - l'iniezione di un Singleton.

La maggior parte dei framework DI può essere configurata per istanziare una singola istanza di un oggetto iniettato. Qualsiasi oggetto consumatore che richiede un'istanza di tale oggetto otterrà la stessa singola istanza. Quell'istanza è per definizione un Singleton. Questo è tutto per il concetto di sovrapposizione.

    
risposta data 23.12.2011 - 20:45
fonte
1

La confusione qui è che due concetti sono stati confusi: il singleton e l'accessor / gateway statico all'istanza singleton.

Come hai giustamente identificato, il tuo collega suggerisce di iniettare la dipendenza piuttosto che accedere direttamente utilizzando Singleton.Instance (gateway statico).

La ragione per cui questo non ha nulla a che fare con il modello singleton è che lo stesso concetto DI si applica ugualmente all'istanza di un oggetto non singleton con new Foo() . La dipendenza verrebbe iniettata indipendentemente dal fatto che si tratti di un'implementazione singleton.

    
risposta data 23.12.2011 - 20:46
fonte

Leggi altre domande sui tag