Как загрузить из базы данных один раз, а затем использовать статические методы для извлечения данных? - PullRequest
1 голос
/ 09 сентября 2010

Я впервые пишу давний читатель этого сайта.

Я создаю сайт .NET MVC, используя ProfilBase для хранения пользовательского объекта.База профилей хранится в базе данных на другом сервере, чем веб-сервер.У меня есть вспомогательный класс UserInfoHelper, который содержит статический метод для получения имени пользователя, электронной почты, телефона и т. Д.

Прямо сейчас метод, например, для получения адреса электронной почты, выглядит следующим образом:

  public static String GetEmail()
    {
        ProfileBase profileBase = HttpContext.Current.Profile as ProfileBase;
        UserObject user = (UserObject)profileBase.GetPropertyValue("UserObject");
        return user.PrimaryEmail;
    }

И с точки зрения я называю их так:

<%= UserInfoHelper.GetEmail() %>

Так что каждый раз, когда я вызываю метод в классе помощника, пользователь выбирается из БД.Я хотел бы, чтобы он просто получал его один раз для каждого пользователя при входе в систему или хотя бы один раз для каждого ответа.Каков наилучший подход для этого?

Также существует ли простой способ получить профиль ProfileBase по умолчанию с помощью веб-служб вместо прямого вызова хранимых процедур?

Заранее большое спасибо.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

Я могу согласиться с тем, что @Paul только что ответил ...

Примеры использования, подобные этим, лучше обрабатываются с действиями контроллера, которые возвращают частичное представление, в котором вы будете отображать информацию пользователя.Вы бы отправили весь экземпляр UserObject (или его представление ViewModel) в View и имели бы строго типизированный View для этого класса.Затем, если это все еще будет представлять проблему с производительностью, вы можете кэшировать выходные данные действия контроллера, используя атрибуты OutputCache для действия.Это предпочтительный способ работы в ASP.NET MVC.

Если, однако, у вас есть страница, на которой вам нужно много информации из разных объектов бизнес-доменов, вы можете создать составные классы View Model, например, так::

public class DashboardViewModel
{
    public UserObject User { get; set; }
    public BusinessData BizData { get; set; }
    public FirmObject Firm { get; set; }
}

На странице просмотра вы начинаете с этой строки

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyNamespace.DashboardViewModel>" %>

, затем вы можете отрисовывать что-либо из DashboardViewModel, которое вы отправили на страницу, следующим образом:

<%: Model.User.Firstname %>

или

<%: Model.BizData.SalesTotal %>

Я просто придумываю это здесь, но это, как правило, так и должно быть.

1 голос
/ 09 сентября 2010

Я думаю, проблема в том, как вы используете MVC больше всего на свете.Вы используете вызов вспомогательного метода прямо на своей веб-странице.Вместо того, чтобы делать это, вы должны передать эту обработку контроллеру или коду, который вызывает (так или иначе), а затем добавить это к модели и использовать что-то вроде <% = Model.Email%> в представлении

После того, как вы внедрили эту модель, обработка уже будет выполняться только один раз за запрос.На этом этапе вы можете профилировать свое приложение и посмотреть, нужна ли какая-либо дальнейшая оптимизация.Опции, открытые для вас, заключаются в том, чтобы обернуть получение адреса электронной почты в какое-то кэширование, которое может сохраняться между вызовами.Но это только в том случае, если это необходимо - вы можете оптимизировать преждевременно, так как могут быть приемлемы накладные расходы при его вызове только один раз за запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...