9 Stimmen

Singleton oder nicht

Ich habe einen Windows-Dienst ausgeführt, in dem ich einen Dienst (WCF) gehostet habe. Ich benötige eine Art von "In-Memory-Datenhalter"-Klasse. Der Zweck dieser Klasse ist es, nicht-persistente Daten zu halten, solange der Windows-Dienst ausgeführt wird. Diese Klasse muss über die WCF-Dienste zugänglich sein. Sie legen einige Werte in dieser Klasse ab oder rufen einige Werte aus dieser Klasse ab.

Das erste, was mir in den Sinn kam, war eine Singleton-Klasse. Ich denke, dieses Muster passt perfekt für diese Situation. Aber dann las ich einige Post, dass die Singleton-Klasse nicht wirklich so gut ist.

Gibt es also eine Alternative für diese Art von Situation? Oder ist das Singleton für diese Situation geeignet? Wie wäre es mit einer Factory-Methode? Aber wo würde ich dann die Referenzen für die Objekte finden?

15voto

Mark Seemann Punkte 216836

Das Singleton-Entwurfsmuster sollte eigentlich in ein Anti-Muster umbenannt werden. Es ist böse . Benutzen Sie es nicht.

Eine bessere Alternative ist die Verwendung von Injektion von Abhängigkeiten (DI) und injizieren eine Klasse, die Sie verwenden können, um die benötigten nicht-persistenten Daten zu speichern.

Viele Leute wissen nicht, dass WCF Dependency Injection (DI) Muster unterstützt, wie z.B. Konstruktor Injektion ohne allzu große Schwierigkeiten.

Wenn Sie die injizierte Klasse als ein langlebiges Objekt (normalerweise als Singleton bezeichnet) lebenslanger Stil (nicht zu verwechseln mit dem Singleton-Entwurfsmuster) können Sie zwischen Aufrufen immer wieder auf dieselbe Instanz zugreifen.

Wann immer Sie jedoch gemeinsam genutzte Objekte verwenden (unabhängig davon, ob Sie Singleton als Entwurfsmuster oder als Lebenszeitstil verwenden), müssen Sie darauf vorbereitet sein, mit Multithreading-Probleme .

Neben vielen anderen Dingen, diese Stelle beschreibt, wie man Abhängigkeiten in eine WCF-Dienstimplementierung einfügt, wenn diese keinen Standardkonstruktor hat.

6voto

AJM Punkte 31386

Ich bin daran interessiert zu wissen, warum Menschen nicht wie die Singleton, ich würde glücklich es für das oben genannte Szenario verwenden, es sei denn, jemand kann mir sagen, einige gute Gründe, warum nicht.

Seine ein einfaches Muster zu verstehen und zu implementieren und ich denke, halten es einfach ist eine gute Sache in 6 Monaten Zeit, wenn Sie oder soemone sonst hat, um Ihren Code zu pflegen

EDIT Nachdem ich etwas mehr nachgeforscht habe, warum manche Leute das Singleton-Muster nicht mögen, wird in der Frage ein nützliches Bündel von Alternativen angesprochen: Was ist die Alternative zu Singleton? Hier geht es um die Nachteile des Musters bei den Einheitstests.

EDIT 2 Ich bin endlich davon überzeugt, dass der Singelton schlecht sein kann. http://googletesting.blogspot.com/2008/08/by-miko-hevery-so-you-join-new-project.html weist darauf hin, dass die Deklaration von Abhängigkeiten auf API-Ebene es Programmierern erleichtert, Abhängigkeiten in den Griff zu bekommen, was die Wartung angeht.

1voto

Oded Punkte 475566

Warum brauchen Sie dafür ein Singleton?

Besteht wirklich die Notwendigkeit, die Instanzen dieser Klasse auf eine einzige Instanz zu beschränken? Wenn nicht, verwenden Sie kein Singleton - Sie brauchen es nicht und es wird Ihre Klasse nur noch komplexer machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X