2010-01-25 17 views
31

Solo quiero asegurarme de que no estoy asumiendo algo tonto aquí, al implementar el patrón singleton en una aplicación web ASP .NET el ámbito de la variable estática es solo para la sesión de usuario actual, ¿verdad? Si un segundo usuario está accediendo al sitio, ¿es un alcance de memoria diferente ...?ASP .NET Singleton

+6

La respuesta corta es no, estás equivocado. –

+1

Duplicado: http://stackoverflow.com/questions/194999/are-static-class-instances-unique-to-a-request-or-a-server-in-asp-net –

Respuesta

28

El ámbito de la variable estática es para todo el dominio de la aplicación, lo que significa que otras sesiones también tienen acceso a él. Solo si tiene una granja con servidores diferentes, tendría más de una instancia de la variable.

+3

+1 "Solo si tiene una granja con diferentes servidores tendría más de una instancia de la variable ". –

4

Si lo necesita para ser usuario o sesión, consulte el siguiente enlace. De lo contrario, como dijo Otavio, el singleton está disponible para todo el dominio.

http://samcogan.com/singleton-per-asp-net-session/

+0

Su enlace parece estar muerto –

+2

@Michael Lang: Sí, lo fue, parece que Sam cambió su motor de contenido. Actualizado el enlace con la nueva referencia. – NotMe

0

El Singleton se utiliza para todo el dominio de aplicación, si desea almacenar los datos relacionados con la sesión del usuario, uso HttpContext Sesión que está diseñado para ese propósito. Por supuesto, es probable que tenga que rediseñar la estructura de su clase para poder encontrar una forma de relación clave-valor-par con los datos con los que está tratando de trabajar.

15

Como otros han mencionado, es una variable estática global to the entire application, not single requests.

Para hacer un producto único mundial sólo a las solicitudes individuales, puede utilizar el diccionario HttpContext.Current.Items.

public class Singleton 
{ 
    private Singleton() { } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (HttpContext.Current.Items["yourKey"] == null) 
       HttpContext.Current.Items["yourKey"] = new Singleton(); 
      return (Singleton)HttpContext.Current.Items["yourKey"]; 
     } 
    } 
} 
+0

Gracias, ¿Cuál es el costo de esto? ¿Será mucho más lento si estoy accediendo al singleton con bastante frecuencia? – Wesly

+0

@Ws No debería notar ningún problema de rendimiento con este enfoque. La implementación del diccionario es bastante eficiente, por lo que no reducirá la velocidad de su aplicación, incluso si accede a ella mucho. –

+0

¿por qué deberíamos usar "HttpContext.Current.Items" en lugar de "Session"? – Seva

32

Los miembros estáticos tener un alcance del proceso de trabajo actual sólo, por lo que no tiene nada que ver con los usuarios, ya que otras peticiones no son necesariamente manejados por el mismo proceso de trabajo.

  • Para compartir datos con un usuario específico y entre solicitudes, use HttpContext.Current.Session.
  • Para compartir datos dentro de una solicitud específica, use HttpContext.Current.Items.
  • Para compartir datos en toda la aplicación, escriba un mecanismo para eso o configure IIS para que trabaje con un solo proceso y escriba una aplicación singleton/use.

Por cierto, el número predeterminado de procesos de trabajo es 1, por eso la web está llena de gente pensando que los miembros estáticos tienen un alcance de toda la aplicación.

-2

Sesión para toda la aplicación por usuario. ViewState para página asp individual.