Domanda

Nel nostro livello di accesso ai dati al lavoro abbiamo questa implementazione standard in cui si accede alla classe tramite una proprietà pubblica singleton che assomiglia a questa:

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

ora capisco cosa sta facendo il codice, ma mi chiedevo perché dovresti farlo semplicemente creando un'istanza della classe ogni volta che viene usata?

È stato utile?

Soluzione

EDIT: Oh whoops, non ho rilevato i " Livelli di accesso ai dati " parte. Ma ne ho anche un esempio: se la tua app multithread incanala tutte le sue chiamate al database attraverso una classe singleton, solo un thread accederà mai al database alla volta, evitando le condizioni di competizione.

Se hai un meccanismo di registrazione in un'applicazione multi-thread che usi per sputare tutte le eccezioni e scrivere semplicemente informazioni (specialmente per servizi o app sempre in esecuzione, stampando gli stati ogni volta che succede qualcosa), lo farai incorrere in problemi di blocco dei file. Uso una classe logger singleton, in modo che solo un thread abbia mai accesso al Logger, e il resto aspetterò fino a quando il Logger è libero di scrivere la loro riga nel file di testo.

Ci sono molte fantastiche ragioni per usare un singleton, ma ero come te e non avevo idea di cosa fossero PER finché non ho riscontrato questo problema con l'accesso ai file in un'app multithread.

Altri suggerimenti

Potresti voler fare anche questo, il suo doppio blocco controllato, accelererà l'accesso al tuo singleton

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }

La risposta è abbastanza semplice: vuoi ottenere lo stesso oggetto ogni volta che viene usato.

Ti offre i vantaggi di essere una variabile globale (ovvero ce n'è solo una) con i vantaggi di essere un oggetto di classe (tra l'altro, può fare l'inizializzazione invisibile la prima volta che è necessario).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top