¿Cuál es la mejor forma de cargar muy reutilizar los datos en una .web de la red de aplicación

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Digamos que tengo una lista de categorías para la navegación en una aplicación web.En lugar de seleccionar de la base de datos para cada usuario, debo agregar una llamada a una función en el application_onStart de la global.asax para recuperar los datos en un array o colección que se vuelve a utilizar una y otra vez.Si mis datos no cambia en absoluto - (Editar - muy a menudo), sería la mejor manera?

¿Fue útil?

Solución

Usted puede almacenar los elementos de la lista en el objeto de la Aplicación.Tienes razón acerca de la application_onStart(), simplemente llamar a un método que va a leer su base de datos y cargar los datos al objeto de la Aplicación.

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

Ahora usted puede tener acceso a su lista en el resto del proyecto.Por ejemplo, en su defecto.aspx para cargar los valores en un DropDownList:

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

Y en el archivo de código subyacente:

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

Otros consejos

Si nunca cambia, es probable que no necesita estar en la base de datos.

Si no hay la cantidad de datos, usted puede ponerlo en la web.config, o como es Enum en el código.

Buscar todos pueden ser costosos.Intente perezoso init, recuperar sólo los datos de la solicitud y, a continuación, almacenar en la caché de la variable.

Prematuro de la optimización es el mal.Que siendo un dado, si usted está teniendo problemas de rendimiento en su aplicación y han "estática" de la información que desea mostrar a los usuarios definitivamente, usted puede cargar los datos en una matriz y la almacena en el Objeto de Aplicación.Usted desea tener cuidado y equilibrar el uso de memoria con la optimización.

El problema que nos encontramos es, entonces, el cambio de la base de datos almacena información y no tener que actualizar la versión en caché.Usted probablemente va a querer tener algún tipo de la última fecha de modificación en la base de datos que se almacenan en el estado junto con los datos de la memoria caché.De esa manera usted puede consultar la mayor cambiado el tiempo y comparar.Si es más reciente que su caché fecha en que usted descarga y recarga.

En una variable de aplicación.

Recuerde que una variable de aplicación puede contener un objeto .Net, así que usted puede crear una instancia del objeto en el mundial.asax y, a continuación, utilizar directamente en el código.

Dado que las variables de la aplicación están en memoria son muy rápidos (vs tener que llamar a una base de datos)

Por ejemplo:

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

Me gustaría almacenar los datos en la Caché de la Aplicación (objeto de Caché).Y no me precarga, me gustaría carga es la primera vez que se solicita.Lo que es bueno acerca de la Caché es que ASP.NET lograremos incluyendo dándole las opciones para caducar la entrada de la caché después de los cambios en el archivo, un período de tiempo, etc.Y ya que las partidas se guardan en la memoria, los objetos no obtener serializar/deserializar modo de uso es muy rápido.

El uso es sencillo.Hay Obtener y Agregar métodos en el objeto Cache para recuperar y añadir elementos a la caché, respectivamente.

Yo uso una estática de la colección como un privado con un público de propiedad estática que la carga o la obtiene de la base de datos.

Además, se puede añadir una estática datetime que se establece cuando se carga y si lo requieren, más allá de una cierta cantidad de tiempo, claro que la estática de la colección y una nueva consulta de la misma.

El almacenamiento en caché es el camino a seguir.Y si tu en patrones de diseño, echa un vistazo a el singleton.

En general, sin embargo no estoy seguro de que yo estaría preocupado de que hasta que se note una degradación del rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top