Каков наилучший способ загрузки повторно используемых данных в веб-приложении.net?
Допустим, у меня есть список категорий для навигации в веб-приложении. Вместо того, чтобы выбирать из базы данных пользователя evey, я должен добавить вызов функции в application_onStart файла global.asax для извлечения этих данных в массив или коллекцию, которая используется снова и снова. Если мои данные не меняются вообще - (Редактировать - очень часто), это будет лучшим способом?
8 ответов
Вы можете сохранить элементы списка в объекте Application. Вы правы насчет application_onStart()
просто вызовите метод, который будет читать вашу базу данных и загружать данные в объект Application.
В 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;
}
}
Теперь вы можете получить доступ к вашему списку в остальной части проекта. Например, в default.aspx для загрузки значений в DropDownList:
<asp:DropDownList runat="server" ID="ddList" DataTextField="Name" DataValueField="Value"></asp:DropDownList>
И в файле с выделенным кодом:
protected override void OnPreInit(EventArgs e)
{
ddList.DataSource = Application[Global.ListItemKey];
ddList.DataBind();
base.OnPreInit(e);
}
Преждевременная оптимизация - это зло. Это само собой разумеющееся, если у вас есть проблемы с производительностью в вашем приложении, и у вас есть "статическая" информация, которую вы хотите отобразить пользователям, вы определенно можете загрузить эти данные один раз в массив и сохранить их в объекте приложения. Вы хотите быть осторожным и сбалансировать использование памяти с оптимизацией.
Проблема, с которой вы столкнулись, заключается в изменении сохраненной в базе данных информации и отсутствии необходимости обновлять кэшированную версию. Возможно, вы захотите иметь какую-то дату последнего изменения в базе данных, которую вы храните в состоянии вместе с кэшированными данными. Таким образом, вы можете запросить самое измененное время и сравнить его. Если она новее, чем ваша кэшированная дата, вы ее сбрасываете и перезагружаете.
В переменной приложения.
Помните, что переменная приложения может содержать объект в.Net, поэтому вы можете создать экземпляр объекта в global.asax и затем использовать его непосредственно в коде.
Поскольку переменные приложения находятся в памяти, они очень быстрые (против вызова базы данных)
Например:
// Create and load the profile object
x_siteprofile thisprofile = new x_siteprofile(Server.MapPath(String.Concat(config.Path, "templates/")));
Application.Add("SiteProfileX", thisprofile);
Если он никогда не изменяется, он, вероятно, не должен быть в базе данных.
Если данных мало, вы можете поместить их в файл web.config или как en enum в своем коде.
Извлечение всего может быть дорогим. Попробуйте lazy init, получите только данные запроса и сохраните их в переменной кэша.
Я хотел бы хранить данные в кэше приложений (объект кэша). И я бы не стал предварительно загружать его, я бы загружал его при первом запросе. Что хорошо в Cache, так это то, что ASP.NET будет управлять им, в том числе предоставляя вам варианты для истечения срока действия записи в кэше после изменения файла, периода времени и т. Д. А поскольку элементы хранятся в памяти, объекты не сериализуются / десериализован, поэтому использование очень быстро.
Использование просто. Существуют методы Get и Add для объекта Cache для извлечения и добавления элементов в кэш соответственно.
Кэширование - это путь. А если вы увлекаетесь дизайном, взгляните на синглтон.
В целом, однако, я не уверен, что буду беспокоиться об этом, пока вы не заметите снижение производительности.
Я использую статическую коллекцию как частную с открытым статическим свойством, которое либо загружает, либо получает ее из базы данных.
Кроме того, вы можете добавить статическое время и дату, которое устанавливается при загрузке, и, если вы вызываете его, по прошествии определенного времени, очистить статическую коллекцию и запросить ее.