Qual è il modo migliore per caricare dati altamente riutilizzati in un'applicazione Web .net

StackOverflow https://stackoverflow.com/questions/64284

  •  09-06-2019
  •  | 
  •  

Domanda

Diciamo che ho un elenco di categorie per la navigazione su un'app Web.Invece di selezionare dal database per ogni utente, dovrei aggiungere una chiamata di funzione in application_onStart di global.asax per recuperare i dati in un array o raccolta che viene riutilizzata più e più volte.Se i miei dati non cambiano affatto - (Modifica - molto spesso), sarebbe questo il modo migliore?

È stato utile?

Soluzione

È possibile memorizzare gli elementi dell'elenco nell'oggetto Applicazione.Hai ragione riguardo a application_onStart(), chiama semplicemente un metodo che leggerà il tuo database e caricherà i dati nell'oggetto Application.

In Global.asax

public class Global : System.Web.HttpApplication
{
    // The key to use in the rest of the web site to retrieve the list
    public const string ListItemKey = "MyListItemKey";
    // a class to hold your actual values. This can be use with databinding
    public class NameValuePair
    { 
        public string Name{get;set;} 
        public string Value{get;set;}
        public NameValuePair(string Name, string Value)
        {
            this.Name = Name;
            this.Value = Value;
        }
    }

    protected void Application_Start(object sender, EventArgs e)
    {
        InitializeApplicationVariables();
    }


    protected void InitializeApplicationVariables()
    {
        List<NameValuePair> listItems = new List<NameValuePair>();
        // replace the following code with your data access code and fill in the collection
        listItems.Add( new NameValuePair("Item1", "1"));
        listItems.Add( new NameValuePair("Item2", "2"));
        listItems.Add( new NameValuePair("Item3", "3"));
        // load it in the application object
        Application[ListItemKey] = listItems;
    }
 }

Ora puoi accedere alla tua lista nel resto del progetto.Ad esempio, in default.aspx per caricare i valori in un DropDownList:

<asp:DropDownList runat="server" ID="ddList" DataTextField="Name" DataValueField="Value"></asp:DropDownList>

E nel file code-behind:

protected override void OnPreInit(EventArgs e)
{
    ddList.DataSource = Application[Global.ListItemKey];
    ddList.DataBind();
    base.OnPreInit(e);
}

Altri suggerimenti

Se non cambia mai, probabilmente non è necessario che sia nel database.

Se non ci sono molti dati, potresti inserirli nel web.config o come en Enum nel tuo codice.

Recuperarli tutti potrebbe essere costoso.Prova lazy init, recupera solo i dati della richiesta e quindi memorizzali nella variabile cache.

L’ottimizzazione prematura è un male.Detto questo, se riscontri problemi di prestazioni nella tua applicazione e hai informazioni "statiche" che desideri visualizzare ai tuoi utenti, puoi sicuramente caricare tali dati una volta in un array e memorizzarli nell'oggetto applicazione.Vuoi stare attento e bilanciare l'utilizzo della memoria con l'ottimizzazione.

Il problema che si incontra è la modifica delle informazioni memorizzate nel database e il mancato aggiornamento della versione memorizzata nella cache.Probabilmente vorrai avere una sorta di data dell'ultima modifica nel database che memorizzi nello stato insieme ai dati memorizzati nella cache.In questo modo puoi interrogare il tempo di variazione maggiore e confrontarlo.Se è più recente della data memorizzata nella cache, scaricalo e ricaricalo.

In una variabile dell'applicazione.

Ricorda che una variabile dell'applicazione può contenere un oggetto in .Net, quindi puoi istanziare l'oggetto in global.asax e quindi utilizzarlo direttamente nel codice.

Poiché le variabili dell'applicazione sono in memoria, sono molto veloci (rispetto alla necessità di chiamare un database)

Per esempio:

// Create and load the profile object
x_siteprofile thisprofile = new x_siteprofile(Server.MapPath(String.Concat(config.Path, "templates/")));
Application.Add("SiteProfileX", thisprofile);

Memorizzerei i dati nell'Application Cache (oggetto Cache).E non lo precaricherei, lo caricherei la prima volta che viene richiesto.La cosa bella della cache è che ASP.NET la gestirà, fornendoti anche le opzioni per far scadere la voce della cache dopo le modifiche ai file, un periodo di tempo, ecc.E poiché gli elementi vengono mantenuti in memoria, gli oggetti non vengono serializzati/deserializzati, quindi l'utilizzo è molto veloce.

L'utilizzo è semplice.Sono presenti metodi Get e Add sull'oggetto Cache per recuperare e aggiungere rispettivamente elementi alla cache.

Utilizzo una raccolta statica come privata con una proprietà statica pubblica che la carica o la ottiene dal database.

Inoltre puoi aggiungere un datetime statico che viene impostato quando viene caricato e, se lo richiedi, trascorso un certo periodo di tempo, cancella la raccolta statica ed esegui nuovamente la query.

La memorizzazione nella cache è la strada da percorrere.E se ti piacciono i design pattern, dai un'occhiata al singleton.

Nel complesso, tuttavia, non sono sicuro che mi preoccuperei finché non noterai un degrado delle prestazioni.

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