2010-02-01 7 views
8

En una aplicación web, necesito tener solo una instancia de una clase llamada ProcessManager. Una forma es hacer que sea un singleton. La otra forma es utilizar el HttpApplicationState para asegurarse de que siempre tienen acceso al mismo ejemplo, así:Singleton y HttpApplicationState

¿Qué método es mejor y por qué?

Respuesta

7

Basándome en la descripción limitada que ha dado, elegiría un Singleton, porque entonces no tiene una dependencia en HttpContext.Current, y puede usarse fuera de la tubería ASP.Net (por ejemplo, cuando desea escribir pruebas unitarias).

(Como complemento, cuando configura algo en ApplicationState, también necesita llamar primero al Lock() y luego Desbloquear() después de que haya terminado de escribir en él, para asegúrese de que sea seguro para hilos.)

O bien, permita la inyección de un HttpContext cuando cree su ProcessManager, de manera que pueda usarlo con un HttpContext falso.

1

(estoy asumiendo que su constructor ProcessManager es privada.)

lo que es un producto único real sería lo mejor, ya que un enfoque de este tipo que sea estructuralmente imposible para otros programadores que están manteniendo su código para crear accidentalmente múltiples instancias. No hay nada que impida que un consumidor acceda a HttpApplicationState directamente y elimine y reemplace la instancia de ProcessManager. Por lo tanto, debe confiar en la convención para proteger la instancia de ProcessManager en HttpApplicationState.

Solo si existe un caso de uso real para que existan varias instancias de la clase, tiene sentido permitir varias instancias mientras se basa en la convención para proteger la instancia en HttpApplicationState.

1

si va a implementarlo como Singleton, as per Jon Skeet (a.k.a C# gurú), él personalmente prefiere el código de abajo

public sealed class Singleton 
{ 
    static readonly Singleton instance=new Singleton(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
}