2010-09-28 12 views
10

Ho un metodo di estensione che utilizza alcune impostazioni di configurazione. Li ho dichiarati come static.Durata delle variabili statiche in .NET

public static class Extensions 
{ 
    static string _mailServer = ConfigurationManager.AppSettings["MailServer"]; 
    // ... etc  

    public static void SendEmailConfirmation(this IOrder order) { } 
} 

Volevo solo verificare che questo stia facendo ciò che intendo perché non sono sicuro al 100%. L'idea è che non voglio dover continuare a leggere questi valori, vorrei che venissero letti una sola volta e memorizzati nella cache per tutta la vita dell'applicazione web. E 'questo che accadrà? Grazie

+1

Non leggerei da una configurazione in un metodo di estensione. Il tuo metodo di estensione dovrebbe funzionare per tutti gli ordini degli autori, ma il tuo funziona solo per IOrders in un'app configurata correttamente. –

+0

Hmmm, non riuscivo a pensare in quale altro modo farlo. Il servizio di notifica non fa realmente parte del modello di dominio, ad esempio l'invio di un'e-mail non dovrebbe essere responsabilità dell'IOPORTO (che sostanzialmente contiene solo i dati dell'ordine). Così ho scritto estensioni che vengono chiamate dal mio controller quando voglio inviare una notifica di un cambiamento nello stato dell'ordine. Pensi che questo abbia senso? O ci sarebbe un modo migliore? – fearofawhackplanet

+0

L'invio di e-mail è solitamente un problema trasversale in un'azienda. Creerei un servizio il cui unico scopo è quello di inviare e-mail. Puoi avere metodi specifici per e-mail specifiche che invii, ma sicuramente isolare l'e-mail che invia parte della tua app. –

risposta

15

(aggiornata con precisazione delle Keiths che non vengono lette fino al momento prima)

Saranno lette la prima volta che vengono utilizzati, e poi mantenuto fino a quando il dominio di applicazione viene arrestato o riciclato, che è probabilmente quello che tu vuoi.

Ovvero, le app ASP.NET vengono eseguite all'interno di un AppDomain. Questo è il modo in cui sono residenti e disponibili a più richieste senza dover avviare l'avvio per ogni singola richiesta. Puoi configurare per quanto tempo vivono e quando riciclano, ecc. Le variabili statiche vivono e muoiono con l'app e quindi sopravviveranno finché l'app è residente nel dominio dell'app.

+0

cool, grazie. (punti di replicazione più facili per te :)) – fearofawhackplanet

+3

Sì, finché una dozzina di persone arriva per chiarire tutti i casi limite in cui questo non è vero al 100% ...;) –

+3

Fondamentalmente questo. Più in particolare, gli statici vengono ponderati quando sono necessari per la prima volta. Ciò consente di risparmiare costi di avvio per l'inizializzazione di un gruppo di statiche. Quindi, la prima volta che esegui SendEmailConfirmation(), accederà alle impostazioni dell'app e lo manterrà per tutta la durata del dominio dell'app (che verrà eseguito fino a quando il pool di app o IIS non verrà ripristinato, il primo verrà eseguito automaticamente di volta in volta , l'altro avviene per scelta dell'utente o su un riavvio del server) – KeithS

1

_mailServer verrà inizializzato la prima volta che viene utilizzata la classe Extensions (in qualsiasi modo). Non verrà reimpostato fino a quando il dominio dell'app non verrà ricaricato.

1

Verranno caricati la prima volta che sono necessari e rimarranno in memoria fino a quando IIS ricicla l'app.