2009-11-19 2 views
50

Я понимаю, что конструктор контроллера не вызывается во время каждого веб-запроса. Предполагая, что это так, каков жизненный цикл контроллера? Is «построен» при запуске приложения, затем кэшируется и вызывается с запросомcontext, введенным в него с каждым веб-запросом?Жизненный цикл контроллера ASP.NET MVC

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

Спасибо!

ответ

74

Если вы используете default controller factory, для каждого запроса будет построен новый экземпляр, и так оно и должно быть. Контроллеры не должны делиться между различными запросами. Вы могли бы написать специальную фабрику, которая управляет временем жизни контроллеров.

+10

Почему, правда? Зачем? –

+2

Я прищурился и научил себя, почему это так и должно быть. Я создавал контроллеры с действиями и представлениями чтения/записи с использованием EF. Сгенерированный код создал частную переменную экземпляра для экземпляра контекста EF. Я думал, что буду умным и сделаю статическую переменную. Проблема в том, что если что-то вне сферы действия этого контроллера изменяет базу данных, статический контекст никогда не знает. Теперь я оставляю его как переменную экземпляра, и поскольку с каждым запросом создается новый экземпляр, контекст может видеть любые изменения в базе данных. – ThatAintWorking

+1

В веб-API, где все состояние содержится в параметрах (то есть в функциональном стиле), нет причин (я могу видеть), почему контроллер нельзя использовать повторно. Он позолочен по дизайну. –

10

Боюсь, ваше понимание неверно. Контроллер (который должен быть очень тонким и легким классом и не должен иметь никакого состояния ожидания сеанса) фактически строится «на лету» для каждого веб-запроса. Как еще может быть экземпляр контроллера конкретным для определенного вида?

Так что нет такого понятия, как «жизненный цикл» (другой, чем у запроса) ...

1

Контроллер создан для каждого запроса вы делаете. Давайте возьмем пример.

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

Теперь вы можете вызвать контроллер из представления, передающего имя пользователя. Не надейтесь получить имя пользователя, которое вы задали в следующем запросе. он вернет null. Таким образом, для каждого запроса создается новый контроллер. Вы не создаете экземпляр контроллера в любом месте MVC, как вы устанавливаете объект из класса. Просто у вас нет указателя памяти объекта контроллера, чтобы вызывать его так же, как с другими объектами.

Перейдите по этой ссылке. Существует хорошее объяснение жизненного цикла контроллера MVC.

ASP.Net MVC - Request Life Cycle

Смежные вопросы