Probleme mit dem Singleton-Muster in der WCF-Service-Methode

8

Ich werde vorangehen und dies vorweg sagen, indem ich sage: Ich bin WCF etwas neu.

Ich arbeite an einer serverseitigen Routine, die für eine Menge Geschäftslogik verantwortlich ist. Es ist von einem Kunden über WCF zugänglich.

Meine WCF-Hauptmethode ruft mehrere andere private Methoden auf. Anstatt alle "Lookup-Daten", die ich für die Geschäftslogik benötige, an jede private Methode weiterzuleiten, entschied ich mich, eine Singleton-Instanz einer Klasse namens DataProvider zu verwenden, die all diese "Lookup-Daten" enthält.

Am Ende der Routine "veröffentliche" ich die Suchdaten des DataProviders, damit das nächste Mal, wenn die Routine ausgeführt wird, die neuesten Suchdaten verwendet werden.

Also, hier ist ein vereinfachtes Beispiel:

%Vor%

Das funktioniert großartig, bis ich zwei verschiedene Clients habe, die die Methode zur gleichen Zeit (oder fast) ausführen. Probleme treten auf, weil sie dieselbe Singleton-Instanz teilen und der Task, der zuerst beendet wird, den DataProvider vor dem Abschluss des anderen Releases freigibt.

Also ...

Was sind meine Möglichkeiten hier?

Ich möchte vermeiden, dass alle Nachschlagedaten weitergegeben werden, so dass das Singleton-Muster (oder irgendein Derivat) wie eine gute Wahl erscheint. Ich muss auch in der Lage sein, mehrere Clients zu unterstützen, die gleichzeitig die Methode aufrufen.

Ich glaube, der WCF-Dienst ist als "Per-Call" konfiguriert. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, einen WCF-Dienst so zu konfigurieren, dass der statische Speicher nicht zwischen Dienstaufrufen geteilt wird.

Jede Hilfe wäre willkommen.

    
John Russell 01.08.2011, 12:15
quelle

3 Antworten

8

WCF verwendet standardmäßig "Per-Call", was bedeutet, dass eine neue Instanz des WCF-Dienstes für jeden Client-Aufruf erstellt wird. Jetzt, seit Sie Singleton implementiert haben, obwohl eine neue Instanz der WCF erstellt wurde, ruft sie immer noch Ihr Singleton auf.

Wenn Sie eine Suche erstellen möchten, die für jeden Anruf erstellt wird (wie Sie es jetzt tun), sollten Sie es nicht als Singleton machen. Auf diese Weise erhält jeder Client, der Ihre Methode aufruft, eine neue Instanz der Suche. Ich denke, das war Ihre Absicht.

Wenn Sie jedoch eine Suche durchführen, die sich nicht so schnell ändert, würde ich empfehlen, sie zwischen allen Aufrufen zu teilen. Dadurch wird die Leistung Ihres WCF-Dienstes verbessert. Sie müssen Ihren WCF-Dienst als

deklarieren %Vor%

Dies bewirkt, dass Singleton automatisch von WCF für Sie erstellt wird, sodass Sie es nicht selbst tun müssen, sondern es wird & gt; 1 gleichzeitiger Benutzer (ConcurrencyMode.Multiple).

Wenn Sie Ihre Suche jetzt ändern und nach einiger Zeit neu geladen werden müssen, empfehle ich Ihnen,

zu verwenden %Vor%

, aber innerhalb Ihres Codes zwischenspeichern Sie es und verfallen dann Ihren Cache zu einer bestimmten Zeit oder relativen Zeit (1 Stunden).

Hier sind einige Links, die Ihnen helfen könnten: 3 Möglichkeiten zur Verwaltung der WCF-Instanzen (pro Anruf, pro Sitzung und einzeln)

Hoffe, das wird helfen.

    
Vlad Bezden 01.08.2011, 13:20
quelle
4

Die statischen Variablen in einem WCF-Dienst werden immer zwischen Instanzen unabhängig von der WCF gemeinsam verwendet Einstellung von InstanceContextMode. Es scheint, dass Sie besser ein Caching-Muster für Ihre Suchdaten verwenden würden. Die Antworten auf diese Caching-Frage bieten einige Alternativen zum Rollen Ihrer eigenen, obwohl sie etwas veraltet sind. p>

Wenn Sie außerdem entscheiden, dass die gesamte Service-Instanz ein Singleton (InstanceContextMode = Single) ist, ist die einfachste Lösung, dass Sie die Service-Skalierbarkeit generell außer Kraft setzen, wenn Sie Ihren Code auch multi-threaded (ConcurrencyMode = Mehrere) . Wenn Sie thread-sicheren Code im Schlaf ausschalten können, dann könnte ein Singleton-Service für Sie sein.

    
Sixto Saez 01.08.2011 12:55
quelle
1

Am einfachsten ist es, einen Synchronisationsmechanismus zu verwenden - haben Sie sich Lock (...) angesehen - das wird als Gatekeeper ähnlich einem kritischen Abschnitt (wenn Sie denen in Windows-Programmierung begegnet sind) fungieren

Definieren Sie ein statisches Objekt in Ihrer Klasse

d.

%Vor%

und benutze es in der Generate-Methode

d. h.

%Vor%     
Shaun Wilde 01.08.2011 12:22
quelle

Tags und Links