2015-10-06 4 views
0

Я разрабатываю проект ASP.NET MVC, и я хотел бы lazy-load объект базы данных DataContext, который используется через Class es в запросе на сервер (то есть, он работает только через запрос и для каждого запроса, У меня есть уникальный объект).Сохраните объект, доступный в запросе на сервер?

В настоящее время я могу получить запрос с использованием HttpContext.Current или HttpContext.Current.Request, но в запросе хранятся только строковые значения.

Есть ли что-то вроде объекта Session, но только для запроса? Что-то вроде ViewBag или ViewData, но доступно из объекта HttpContext?

EDIT: Вот что я пытаюсь достичь: у меня есть класс AccountBusiness, который может быть создан несколько раз в запросе. Он имеет свойство LoggedInUser (примечание: это не объект AspNetUser ASP.NET Identity), который ленив. Обычно я хотел бы сделать что-то вроде этого:

private UserProfile loggedInProfile; 
    public UserProfile LoggedInProfile 
    { 
     get 
     { 
      if (this.loggedInProfile == null) 
      { 
       var userId = HttpContext.Current.User.Identity.GetUserId(); 
       this.loggedInProfile = this.Context.UserProfiles.FirstOrDefault(q => q.ID == userId); 
      } 

      return this.loggedInProfile; 
     } 
    } 

Однако, как я уже говорил ранее, это свойство может быть инстанцировано несколько раз в запросе, он будет иметь доступ к нескольким раз для базы данных только одного и того же объекта UserProfile. Это просто пример, у меня гораздо больше объектов, подобных этому, и хотел бы изменить так, что доступ только к базе данных один раз, а затем сохранить его для использования для текущего запроса, как это:

public UserProfile LoggedInProfile 
    { 
     get 
     { 
      if (this.loggedInProfile == null) 
      { 
       var dataTokens = HttpContext.Current.Request.RequestContext.RouteData.DataTokens; 
       object o; 
       if (!dataTokens.TryGetValue("CurrentUserProfile", out o)) 
       { 
        var userId = HttpContext.Current.User.Identity.GetUserId(); 
        dataTokens["CurrentUserProfile"] = o = this.Context.UserProfiles 
         .FirstOrDefault(q => q.ID == userId); 
       } 
       this.loggedInProfile = o as UserProfile; 
      } 

      return this.loggedInProfile; 
     } 
    } 

ли В моем решении есть что-то плохое?

P.s: Я только что обнаружил, что RouteValues и DataTokens могут содержать пару key-object, но мне интересно, можно ли использовать его?

ответ

2

Используйте HttpContext.Items коллекции для обмена объектов в течение всего срока службы запроса.

+0

Спасибо, это на самом деле то, что мне нужно! –

0

Вы можете использовать Cache или Cookie, оба доступны с HttpContext, и после использования вы можете их очистить.

+0

Для 'Cache' и' Cookie' вам нужно вручную удалить значения, что не так. Более того, 'Cookie' может хранить только значения' string'. –

+0

@ DatVM и память хранят только байты - ваша точка о строке? –

1

Я хотел был бы lazy-load база данных Объект DataContext, который используется только в запросе.

Этот бит беспокоит меня. Возможно, это просто сформулировано неловко, но похоже, что вы как-то пытаетесь сохранить свой контекст по запросам, что будет плохой идеей .

Если, однако, вы просто говорите о сохранении результатов запроса или подобных данных, я бы рекомендовал использовать кэширование в памяти, предоставляемое ASP.NET. Использование сеанса или файлов cookie предполагает использование клиента для хранения информации, и это является ненужным и неуместным для такого рода вещей.

+0

Простите, может быть, мои слова неверны и вас беспокоят. Я имею в виду, я хочу получить доступ к нему через контроллер, модели и т. Д. ** в запросе **. Я знаю, что повторное использование объекта DataContext плохо. Кроме того, помимо DataContext, я хотел бы также сохранить зарегистрированный объект User. Надеюсь, теперь вы понимаете мое объяснение. –

+0

Во-первых, объект Request по-прежнему является неправильным местом для этого, так как это потребует зависимости от объекта Request в таких местах, как ваша модель, что совершенно неуместно. Во-вторых, ваши модели не должны зависеть от контекста * вообще *, независимо. В-третьих, пользовательский объект * уже * в запросе, поэтому я не уверен, что вам еще нужно. Возможно, если бы вы дали больше информации о том, что вы пытаетесь достичь, и * почему *, мы могли бы дать вам лучшее руководство о том, как действовать дальше. «Почему» особенно важно. Какую проблему ты пытаешься решить? –

+0

Спасибо за ваш комментарий. Я обновил вопрос, пожалуйста, посмотрите. –

0

Использование и Inversion of Control. Большинство инструментов МОК, таких как Castle Windsor, позволят вам сохранить ваш контекст для жизни запроса.

Если вы не знакомы с DI, вот простой пример:

Mycontroller 
{ 
    IMyContext _contex; 
    public Mycontroller(IMyContext context) 
    { 
     _context = context; 
    } 
} 
Смежные вопросы