2009-11-18 12 views
21

Ich glaube, Jimmy Nillson hat gesagt, dass er im Allgemeinen seine Webservices Singletons gemacht hat. Ist dies die bevorzugte Methode und mit WCF? Anders als die Service-Methoden statisch zu machen, gibt es noch etwas anderes zu tun?Sollte der WCF-Dienst normalerweise Singleton sein oder nicht?

+0

Haben Sie einen Link zu jemandem, der gesagt hat, Singletons zu verwenden? Vielleicht gibt es einen zwingenderen Grund als jeder von uns denken kann ... –

+0

Es war in seinem Buch, "Domain-Driven Design und Patterns anwenden: Mit Beispielen in C#". – suedeuno

Antwort

24

gute Antworten, aber ich denke, es gibt ein Problem in der ursprünglichen Frage. "Typischer Einsatz" einer Technologie ist eine schlecht formulierte Frage. Niemand hat ein "typisches" Szenario, und Sie sollten die Anforderungen Ihres speziellen Problems überprüfen, bevor Sie sich für eine Implementierung oder einen Ansatz entscheiden. Ihre Anforderungen sollten Ihre Lösung informieren. Beispielsweise sind Singletons [dh das Singleton-Muster] nur ein weiteres Werkzeug in unserer Box, und wie jedes Werkzeug gibt es Fälle, wo es funktioniert, und andere nicht. Insbesondere, wenn Sie Geschäftslogik zentralisieren müssen [mehr anwendbar in einer eigenständigen Anwendung als ein WCF-Remote-Dienst] oder Speicher oder eine Ressource freigeben, funktioniert ein Singleton gut. Wenn Sie Geschäftslogik teilen, wird der Status natürlich im Aufruf-Stack beibehalten, und Multithreading ist überflüssig. Wenn Speicher zwischen Consumer-Anrufen freigegeben wird, ist Multithreading ein Problem. Wie WCF betrifft, gibt es zwei Modi [eigentlich drei, aber der dritte ist ein Sonderfall des ersten ist] von Multi-Thread-Verhaltens können Sie festlegen,

// we are specifying that this service implementation is single-threaded 
// and WCF should permit *at most* one call at a time. Any requests made 
// simultaneously/concurrently are queued. 
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)] 
public class SingleThreadedNonThreadSafeService : IService { ... } 

und

// we are specifying that this service implementation is multi-threaded 
// and [hopefully!] thread-safe. WCF should permit any number of threads, 
// or any number of simultaneous concurrent calls. 
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class MultiThreadedThreadSafeService : IService { ... } 

Die XML-Kommentare für ConcurrencyMode sagen grundsätzlich das gleiche wie oben.

Wenn Sie NICHT brauchen DO Business-Logik oder Speicher zwischen Verbrauchern zu teilen, dann einen Singleton NICHT DO verwenden, das „Modell“ DOES paßt nicht das Problem. Es ist, als ob man einem Stiefschwester einen Glasschuh auf den Fuß drückt! Und niemand sollte das jemals sehen müssen.

Umgekehrt, wenn zwischen den Aufrufen kein Status besteht, eine Instanz pro Anruf \ Sitzung hosten.

+0

Ich denke, die Interpretation der Frage Besitzer wurde verpasst. Ich dachte, er redete über die Client-Instanz des Proxy-Clients und nicht über den Dienst selbst. In keinem Fall würde es Sinn machen, den Host zu einem Singleton zu machen, er ist staatenlos. Ich glaube, die eigentliche Frage, die er stellen wollte, lautete: Sollte die WCF-Service-Client-Instanz, die vom Kunden des Service verwendet wird, ein Singleton sein oder nicht? @suedeuno ??? – Seabizkit

19

Normalerweise NICHT. Singletons sind ein Durcheinander, denn um sie gut funktionieren zu lassen, musst du sie multi-threaded machen, und das verlangt nur Ärger, wenn du nicht wirklich wirklich weißt, was du tust.

Die beste Vorgehensweise für WCF ist die Instanziierung pro Aufruf - jede Anforderung erhält ihre eigene Kopie der Serviceklasse, keine Multi Threading-Probleme, gute Performance - speichert alles, was in einer Datenbank bestehen muss - funktioniert wie a Charme. Das einzige wirkliche Szenario, in dem Singleton sinnvoll sein könnte, ist, wenn alle Serviceanforderungen von einer physischen Ressource verwendet/verarbeitet werden müssen, die nur in einer einzigen Instanz verfügbar ist. Wenn Ihr Singleton-Service eine einzelne Ressource serialisiert und schützt, dann macht es Sinn, es zu benutzen.

Sonst - ersparen Sie sich den Ärger! :-)

+2

+1 einige meiner Mitarbeiter fanden das auf die harte Tour .... in Produktion. – kemiller2002

+0

Wenn er auf die Hostservice-Instanz von in der Hosting-Umgebung (Windows-Dienst, Konsolenanwendung) zugreift, um sie an Clients zu senden, könnte es einfacher sein, das Singleton-Muster zu implementieren; Andernfalls muss er entweder einen Client erstellen oder eine Instanz über einen Instanzenanbieter abrufen. - Die Client-Route könnte nützlich sein, aber ich fand die Verwendung, was bereits erstellt wurde, funktionierte gut. Bis jetzt habe ich keine Threading-Probleme. Und der Dienst hat die Leistung, die ich brauche und scheint stabil zu sein. – Stix

8

Singleton WCF-Dienste sollten kaum genutzt werden - Singletons sind der Feind der Skalierbarkeit! Sie machen nur in seltsamen Szenarien Sinn - Protokollierung in einer einzigen Datei, einem einzelnen Kommunikationsport oder Hardware-Gerät.

Wie Marc sagt, ist die beste Wahl für die Skalierbarkeit mit WCF pro Anrufdienste (sie bieten den besten Kompromiss zwischen Leistung und Skalierbarkeit). Per Call-Dienste funktionieren auch sehr gut mit Load-Balancing.

+0

Ja, dies wurde vor einiger Zeit beantwortet, aber könnten Sie den Kommentar erweitern, dass "Per Call-Dienste auch sehr gut mit Load Balancing funktionieren"? – McArthey

+0

Ich denke, was @McArthey darauf hingewiesen hat ist, dass wenn Sie "Per Call" -Dienste verwenden, gibt es Ihnen die Möglichkeit, Ihre "Anrufe" über mehrere Server zu verteilen, ohne sich Gedanken über den Status zu machen. –

Verwandte Themen