Жизненный цикл контроллера ASP.NET MVC

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

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

Спасибо!

Ответ 1

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

Ответ 2

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

Таким образом, нет такой вещи, как "жизненный цикл" (кроме запроса)...

Ответ 3

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

   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 - запрос жизненного цикла