Frage

In unserer Datenzugriffsschicht bei der Arbeit haben wir diese Standard-Implementierung, wo die Klasse durch ein Singleton öffentliches Eigentum zugegriffen wird, die etwa wie folgt aussieht:

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

Jetzt habe ich bekommen, was der Code tut, aber ich frage mich, warum Sie dies nur tun würde, über eine Instanz der Klasse erstellt jedes Mal, es verwendet wird?

War es hilfreich?

Lösung

EDIT: Oh hoppla Ich habe nicht den "Data Access Layer" Teil fangen. Aber ich habe ein Beispiel, dass zu. Wenn Ihr multithreaded App Trichter alle seine Datenbank eine Singleton-Klasse rufen durch, nur ein Thread jemals die Datenbank auf einmal zugreifen, Rennbedingungen zu vermeiden

Wenn Sie einen Logging-Mechanismus in einer Multi-Threaded-Anwendung, die Sie verwenden, um alle Ausnahmen auszuspucken und nur Informationen schreiben in (vor allem für Dienstleistungen oder Anwendungen, die immer ausgeführt werden, Stati Ausdrucke, wenn Sachen geschehen), werden Sie laufen in file-locking Probleme. Ich benutze eine Singleton-Logger-Klasse, so dass nur ein Thread immer Zugriff auf den Logger haben wird, und der Rest wird warten, bis der Logger frei ist ihre Linie in der Textdatei zu schreiben.

Es gibt viele coole Gründe, einen Singleton zu verwenden, aber ich war wie du und hatte keine Ahnung, was sie waren, bis ich mit dem Dateizugriff in einem Multi-Thread-App in diese Ausgabe lief.

Andere Tipps

Sie möchten kann dies auch tun, seine doppelt geprüft Verriegelung, wird es Zugriff auf Ihre Singletons beschleunigen

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

                            }
                        }   
                        return _instance;
                }
        }

Die Antwort ist ganz einfach: Sie wollen, dass die Gleiche bekommen Objekt jedes Mal, es verwendet wird.

Es gibt Ihnen die Vorteile einer globalen Variablen zu sein (das heißt es gibt nur eine) mit den Vorteilen der ein Klassenobjekt sein (unter anderem kann es invisable Initialisierung tun das erste Mal, es ist erforderlich).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top