Was ist der beste Weg, hoch wiederverwendet werden Daten in einer .net Web-Anwendung zu laden

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

  •  09-06-2019
  •  | 
  •  

Frage

Lassen Sie uns sagen, dass ich eine Liste der Kategorien für die Navigation auf einer Web-App haben. Anstatt aus der Datenbank für Benutzer evey Auswahl soll ich einen Funktionsaufruf in der Application_OnStart der global.asax hinzuzufügen, dass Daten in eine Anordnung oder Sammlung zu holen, die wiederverwendet wird, immer und immer wieder. Wenn meine Daten überhaupt nicht ändern - (Edit - sehr oft), wäre dies der beste Weg sein

War es hilfreich?

Lösung

Sie können speichern Sie die Listenelemente in das Application-Objekt. Sie haben Recht, über die application_onStart(), einfach eine Methode aufrufen, die Datenbank lesen und die Daten an das Application-Objekt laden.

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

Jetzt können Sie Ihre Liste im Rest des Projektes zugreifen. Zum Beispiel in default.aspx die Werte in einer Dropdownlist zu laden:

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

Und in der Code-Behind-Datei:

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

Andere Tipps

Wenn es sich nie ändert, ist es wahrscheinlich braucht nicht in der Datenbank zu sein.

Wenn es nicht viele Daten, können Sie es in der web.config setzen oder als en Enum in Ihrem Code.

alle Fetching kann teuer sein. Versuchen Sie faul init, holen nur Anforderungsdaten und speichern sie im Cache-Variable.

Vorzeitige Optimierung ist böse. Das ist eine bestimmte, wenn Sie Performance-Probleme in Ihrer Anwendung haben und Sie haben „statische“ Informationen, die Sie möchten Ihren Benutzern angezeigt werden können Sie auf jeden Fall, dass die Daten geladen werden einmal in ein Array und speichern sie in der Application-Objekt. Sie wollen, vorsichtig sein und die Speichernutzung mit Optimierung balancieren.

Das Problem, das Sie dann laufen in ist die Datenbank gespeicherten Informationen zu ändern und nicht mit der Cache-Version aktualisieren. Sie würden wahrscheinlich eine Art letzten Änderung Datum in der Datenbank haben wollen, die Sie zusammen mit den zwischengespeicherten Daten im Zustand speichern. Auf diese Weise können für die größte geänderte Zeit abfragen und vergleichen. Wenn es neuer als die zwischengespeicherten Datum dann Sie Dump und neu zu laden.

In einer Anwendungsvariablen.

Denken Sie daran, dass eine Anwendung Variable ein Objekt in .NET enthalten kann, so können Sie das Objekt in den global.asax instanziiert und dann direkt im Code verwenden.

Da Anwendungsvariablen im Speicher ist, sind sie sehr schnell (vs mit einer Datenbank nennen)

Zum Beispiel:

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

Ich würde die Daten in der Application Cache (Cache-Objekt). Und ich würde es nicht vorzuladen, würde ich es das erste Mal laden sie angefordert wird. Was ist mit dem Cache schön ist, dass ASP.NET verwalten einschließlich es Ihnen Optionen für die auslaufenden den Cache-Eintrag nach Dateiänderungen, eine Zeitperiode geben, etc. Und da die Elemente im Speicher gehalten werden, geben die Objekte nicht serialisiert erhalten / deserialisiert so Nutzung ist sehr schnell.

Die Verwendung ist einfach. Es gibt dir und Add-Methoden auf dem Cache-Objekt abzurufen bzw. Elemente in den Cache hinzufügen.

Ich benutze eine statische Sammlung als Privat mit einer öffentlichen statischen Eigenschaft, die entweder Lasten oder sie aus der Datenbank werden.

Zusätzlich können Sie eine statische Datumzeit hinzufügen, die gesetzt wird, wenn es geladen wird, und wenn Sie es nennen, vorbei an einer gewissen Zeit, deaktivieren Sie die statische Sammlung und requery es.

Caching ist der Weg zu gehen. Und wenn Ihr in Design Patterns, werfen Sie einen Blick auf die Singleton.

Insgesamt aber ich bin mir nicht sicher, ob ich darüber besorgt sein würde, bis Sie Leistungsabfall bemerken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top