2010-12-10 18 views
5

Tengo una pregunta sobre Singletons ejecutándose dentro de IIS (6,7,7.5) y una aplicación web ASP.NET 4.0 (la aplicación MVC3 es específica).Singleton se ejecuta en aplicaciones web Asp.Net

Tengo un objeto singleton en mi proyecto al que se accede y se utiliza en global.ascx, en el inicio de la aplicación, así como en algunos otros lugares dentro de la aplicación.

Mi preocupación es que este singleton debe ser accesible en un escenario por instancia. Sin embargo, dado que IIS es esencialmente el proceso de alojamiento, ¿el singleton va a ser el mismo objeto en todas las instancias de la aplicación?

Si utilizo la palabra clave [ThreadStatic], ¿se separa en el nivel del Grupo de aplicaciones?

Finalmente, hay una manera, puedo asegurar que un singleton es solo un singleton por instancia de mi aplicación. es decir, si ejecuto mi aplicación en 1 sitio web, pero dentro de 5 directorios virtuales, hay 5 instancias del singleton o si ejecuto mi sitio web en 5 sitios web diferentes dentro del mismo grupo de aplicaciones.

Esperemos que sea lo suficientemente claro, en caso de que desee ver el objeto singleton, pegué la idea general de ello a continuación.

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

Todavía estoy confundido. ¿Sabes cómo funciona o no? ¿Puedes hacer la pregunta un poco más clara? – jcolebrand

+0

Sé cómo funciona un singleton en un nivel por proceso. La pregunta es cómo lo manejará IIS en múltiples instancias de mi aplicación. – John

+0

Solo por curiosidad, ¿por qué está desechable su singleton? ¿Esperas tener periodos de tiempo en los que desees que se elimine y luego lo resucitas cuando alguien lo solicita? Los singletons verdaderos normalmente no se eliminan hasta que finaliza la aplicación. – StriplingWarrior

Respuesta

0

Con IIS, no tiene control sobre el hilo en el que se ejecuta su solicitud. Si realmente necesita este tipo de bloqueo de nivel de instancia de la aplicación, puede buscar en los objetos de bloqueo más pesados ​​(Mutex, Monitor, etc.) y crear uno para cada aplicación.

3

Un valor estático debe ser estático en una instancia particular de su aplicación web, por lo que cada instancia de la aplicación tendrá su propia instancia que se compartirá en todos los subprocesos de esa instancia.

Para la lectura adicional, consulte http://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.71).aspx

Ah, y el ThreadStatic attribute hará que el valor estático que sólo se estática a través de un hilo en particular, por lo que cada solicitud tendría su propia versión de ese campo. No parece que esto es lo que estás buscando.

+1

Entiendo mucho, es más o menos cómo IIS controla las instancias. Como su aplicación se ejecuta bajo el control de IIS, ese es esencialmente el proceso de control (w3wp.exe), por lo tanto, si tenemos 5 instancias en ejecución, tenemos un problema con la separación de singletons entre esas 5 instancias porque todas se ejecutan bajo w3wp.exe . – John

+0

@John: del artículo al que se hace referencia, "Puede ejecutar varios dominios de aplicaciones en un solo proceso con el mismo nivel de aislamiento que existiría en procesos separados". Así que IIS tiene un único proceso, pero ejecuta cada instancia de la aplicación en su propio dominio de aplicación, por lo que la carga de clases se manejará como si cada aplicación fuera una aplicación independiente, completamente aislada de las demás. – StriplingWarrior

+1

Entonces, ¿está 100% seguro de que IIS ejecutará 5 directorios virtuales diferentes en un dominio de aplicación separado, incluso con el mismo grupo de aplicaciones? – John

0

Si desea asegurarse de que están separados, puede ejecutar cada uno en su propio grupo de aplicaciones. De esa forma obtendrías un WP para cada directorio virtual.

+2

¿Por qué -1? ¿Esto no funciona? Si no, me gustaría saber para mi futura referencia. – Greg

Cuestiones relacionadas