2010-12-10 5 views
5

Ich habe eine Frage über Singletons in IIS (6,7,7.5) und eine ASP.NET 4.0 Web Application (MVC3 App um genau zu sein).Singleton läuft auf Asp.Net Web-Anwendungen

Ich habe ein Singleton-Objekt in meinem Projekt, auf das zugegriffen wird und in der global.ascx, auf dem Anwendungsstart sowie an einigen anderen Stellen innerhalb der Anwendung verwendet wird.

Mein Problem ist, dass dieser Singleton Zugriff auf eine pro Instanz Szenario sein muss. Da IIS jedoch im Wesentlichen der Hosting-Prozess ist, wird das Singleton in allen Instanzen der Anwendung dasselbe Objekt sein?

Wenn ich das Schlüsselwort [ThreadStatic] verwende, unterscheidet es sich auf Ebene des Anwendungspools?

Schließlich gibt es einen Weg, ich kann sicherstellen, dass ein Singleton nur ein Singleton pro Instanz meiner Anwendung ist. Wenn ich meine Anwendung auf 1 Website, aber in 5 virtuellen Verzeichnissen ausführe, gibt es 5 Instanzen des Singleton oder wenn ich meine Website auf 5 verschiedenen Websites im selben Anwendungspool betreibe.

Hoffentlich ist das klar genug, wenn Sie das Singleton-Objekt sehen wollten, habe ich die allgemeine Idee darunter eingefügt.

public sealed class Singleton : IDisposable 
{ 
    [ThreadStatic] 
    private static volatile Singleton _instance; 
    [ThreadStatic] 
    private static readonly object _syncRoot = new object(); 

    public bool IsReleased { get; private set; } 

    public Singleton() 
    { 
     IsReleased = false; 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_syncRoot) 
       { 
        if (_instance == null) 
         _instance = new Singleton(); 
       } 
      } 

      return _instance; 
     } 
    } 

    public void Dispose() 
    { 
     IsReleased = true; 
     Singleton._instance = null; 
    } 
} 
+0

Ich bin immer noch verwirrt. Weißt du wie es funktioniert oder nicht? Können Sie die Frage etwas klarer stellen? – jcolebrand

+0

Ich weiß, wie ein Singleton pro Prozessebene "funktioniert". Die Frage ist, wie IIS es in mehreren Instanzen meiner Anwendung handhaben wird. – John

+0

Nur aus Neugier, warum ist dein Singleton wegwerfbar? Erwarten Sie Zeiträume, in denen Sie möchten, dass sie entsorgt werden, und dann wieder auferstehen, wenn jemand danach fragt? Echte Singletons werden typischerweise nicht angeordnet, bis die Anwendung endet. – StriplingWarrior

Antwort

0

Mit IIS haben Sie keine Kontrolle über den Thread, auf dem Ihre Anfrage ausgeführt wird. Wenn Sie diese Art der Sperrung auf Anwendungsinstanzebene wirklich benötigen, sollten Sie sich die schwereren Sperrobjekte (Mutex, Monitor usw.) ansehen und für jede Anwendung eine erstellen.

3

Ein statischer Wert sollte für eine bestimmte Instanz Ihrer Webanwendung statisch sein, sodass jede Instanz Ihrer Anwendung über eine eigene Instanz verfügt, die für alle Threads dieser Instanz freigegeben wird. siehe

Für weitere Lesung http://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.71).aspx

Oh, und die ThreadStatic attribute bewirkt, dass der statische Wert nur über einen bestimmten Thread statisch sein, so würde jede Anfrage eine eigene Version dieses Feld hat. Es klingt nicht so, als ob du das willst.

+1

Ich verstehe so viel, es ist mehr oder weniger wie IIS die Instanzen steuert. Da Ihre Anwendung unter Kontrolle von IIS läuft, handelt es sich im Wesentlichen um den Steuerungsprozess (w3wp.exe). Wenn also 5 Instanzen ausgeführt werden, haben wir ein Problem mit Singletons, die zwischen diesen 5 Instanzen getrennt sind, da sie alle unter w3wp.exe ausgeführt werden . – John

+0

@ John: Aus dem Artikel, auf den verwiesen wird, "Sie können mehrere Anwendungsdomänen in einem einzigen Prozess mit der gleichen Isolationsstufe ausführen, die in separaten Prozessen vorhanden wäre." IIS hat also einen einzigen Prozess, aber es führt jede Anwendungsinstanz in einer eigenen Anwendungsdomäne aus, sodass Dinge wie das Laden von Klassen so gehandhabt werden, als ob jede Anwendung eine eigenständige Anwendung wäre, vollständig isoliert von den anderen. – StriplingWarrior

+1

Sie sind also 100% sicher, dass IIS 5 verschiedene virtuelle Verzeichnisse in einer separaten App-Domäne ausführt, sogar mit demselben Anwendungspool? – John

0

Wenn Sie unbedingt sicherstellen möchten, dass sie getrennt sind, können Sie jedes in seinem eigenen Anwendungspool ausführen. Auf diese Weise erhalten Sie ein WP für jedes virtuelle Verzeichnis.

+2

Warum -1? Funktioniert das nicht? Wenn nicht, würde ich gerne für meine eigene zukünftige Referenz wissen. – Greg

Verwandte Themen