2010-02-01 15 views
8

In un'applicazione Web, ho bisogno di avere solo un'istanza di una classe chiamata ProcessManager. Un modo è renderlo un singleton. L'altro modo è quello di utilizzare il HttpApplicationState per assicurarsi che ho sempre accedere alla stessa istanza, in questo modo:Singleton e HttpApplicationState

Quale metodo è migliore e perché?

risposta

7

In base alla descrizione limitata che hai fornito, sceglierei Singleton, perché non ha una dipendenza da HttpContext.Current e può essere utilizzato al di fuori della pipeline ASP.Net (ad esempio, quando si desidera scrivere test unitari.)

(Per inciso, quando si imposta qualcosa in ApplicationState, è anche necessario prima chiamare Lock() su di esso e quindi Sbloccarlo() dopo aver finito di scriverlo, per

In alternativa, consentire l'iniezione di un HttpContext quando si crea il ProcessManager, in modo tale che è possibile utilizzarlo con un HttpContext deriso.

1

(sto assumendo il vostro costruttore ProcessManager è privata.)

che lo rende un vero e proprio Singleton sarebbe meglio, perché un tale approccio renderebbe strutturalmente impossibile per altri programmatori che stanno mantenendo il codice per creare accidentalmente multipla le istanze. Non c'è nulla che impedisca a un utente di accedere direttamente a HttpApplicationState e di rimuovere e sostituire l'istanza di ProcessManager. Quindi è necessario fare affidamento sulla convenzione per proteggere l'istanza di ProcessManager in HttpApplicationState.

Solo se esiste un caso di utilizzo effettivo per l'istanza di più istanze della classe, è opportuno consentire più istanze mentre si fa affidamento sulla convenzione per proteggere l'istanza in HttpApplicationState.

1

se avete intenzione di implementarlo come Singleton, as per Jon Skeet (a.k.a C# guru), preferisce personalmente il codice qui sotto

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; 
     } 
    } 
}