Domanda

Ho alcuni servizi Web ASP.NET che condividono tutti una classe helper comune di cui devono istanziare solo un'istanza per server.Viene utilizzato per la semplice traduzione dei dati, ma impiega del tempo durante l'avvio caricando elementi dal file web.config, ecc. La classe helper è thread-safe al 100%.Pensatela come una semplice libreria di chiamate di utilità.Renderei tutti i metodi condivisi sulla classe, ma voglio caricare la configurazione iniziale da web.config. Abbiamo distribuito i servizi Web su IIS 6.0 e utilizzando un pool di applicazioni, con un Web Garden di 15 dipendenti.

Ho dichiarato la classe helper come variabile condivisa privata in Global.asax e ho aggiunto una proprietà Shared ReadOnly a caricamento lento come questa:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

Ho il codice di registrazione nel costruttore per MyHelperClass(), e mostra il costruttore in esecuzione per ogni richiesta, anche sullo stesso thread.Sono sicuro che mi mancano solo alcuni dettagli chiave di ASP.NET ma MSDN non è stato molto utile.

Ho provato a fare cose simili usando entrambi Application("Helper") E Cache("Helper") e ho ancora visto il costruttore funzionare con ogni richiesta.

È stato utile?

Soluzione

Non è saggio utilizzare lo stato dell'applicazione a meno che non lo richiedi assolutamente, le cose sono molto più semplici se ti limiti a utilizzare oggetti per richiesta.Qualsiasi aggiunta di stato alle classi helper potrebbe causare ogni sorta di sottili errori.Utilizzare la raccolta di elementi HttpContext.Current e inizializzarla per richiesta.Un modulo VB farebbe quello che vuoi, ma devi essere sicuro di non renderlo stateful.

Altri suggerimenti

Puoi posizionare il tuo aiutante nello stato dell'applicazione.Fallo in global.asax:

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

Puoi utilizzare l'Helper in questo modo:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

Ciò si traduce in una singola istanza della classe MyHelperClass creata all'avvio dell'applicazione e residente nello stato dell'applicazione.Poiché l'istanza viene creata in Application_Start, ciò avviene solo una volta per ogni istanza di HttpApplication e non per Request.

Ho fatto qualcosa del genere nella mia app in passato e ha causato tutti i tipi di errori strani.Ogni utente avrà accesso ai dati di tutti gli altri nella proprietà.Inoltre potresti ritrovarti con un utente che lo sta utilizzando e che viene tagliato fuori perché richiesto da un altro utente.

No, non è isolato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top