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?
Antwort
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.
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
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! :-)
+1 einige meiner Mitarbeiter fanden das auf die harte Tour .... in Produktion. – kemiller2002
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
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.
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
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. –
- 1. Sollte Logger privat statisch sein oder nicht
- 2. Singleton oder nicht
- 3. Sollte ein Singleton PixelShader eine Best Practice sein?
- 4. ProgressDialog sollte nicht stornierbar sein
- 5. Sollte der "Versuch" vor oder nach der Ressourcenzuweisung sein?
- 6. Was sollte der Ersthelfer sein: meine Sicht oder UIDatePicker?
- 7. Sollte dies mehrdeutig sein oder nicht? (implizite Umwandlungen)
- 8. Sollte die ID im Geschäftsobjekt schreibgeschützt sein oder nicht?
- 9. Sollte IBOutlet schwach oder stark sein?
- 10. C#: Sollte der Standardwert einer Enum None oder Unknown sein?
- 11. JavaEE6 DAO: Sollte es @Stateless oder @ApplicationScoped sein?
- 12. Wann sollte ein Faden normalerweise nachgeben?
- 13. Sollte HTML-Meta-Zeichensatz Klein- oder Großbuchstaben sein?
- 14. Asp. Net MVC Viewmodel sollte Klasse oder Struktur sein?
- 15. Sollte ein Software-Service vollständig eigenständig sein oder kann/sollte er Teil einer größeren Komponente sein?
- 16. Wird System.Numerics.BigInteger unveränderlich sein? Sollte es sein?
- 17. Sollte `System.IO.Path` konkret sein?
- 18. "Singleton" Fabriken, ok oder schlecht?
- 19. Sollte CIII gleich sein?
- 20. loadNibNamed in Swift sollte zurück Singleton Objekt
- 21. Sollte der Code kurz/prägnant sein?
- 22. Nicht behandelte Ablehnungsgründe (sollte leer sein)
- 23. SQL-Alchemie ResultProxy.rowcount sollte nicht 0 sein
- 24. Sollte das nicht "= +" ein Syntaxfehler sein?
- 25. Sollte ein Java Singleton statische Variablen verwenden?
- 26. Pfadkomponente sollte '/' sein
- 27. Sollte `Phone` eine Klasse oder eine Struktur in C# sein?
- 28. Sollte eine Methode, die eine Klasseninstanz aus der Datenbank lädt, statisch oder nicht statisch sein?
- 29. Sollte eine BLL zustandslos sein?
- 30. Warum $ '\ 0' oder $ '\ x0' ist eine leere Zeichenfolge? Sollte der Null-Charakter sein, oder?
Haben Sie einen Link zu jemandem, der gesagt hat, Singletons zu verwenden? Vielleicht gibt es einen zwingenderen Grund als jeder von uns denken kann ... –
Es war in seinem Buch, "Domain-Driven Design und Patterns anwenden: Mit Beispielen in C#". – suedeuno