Member 11072126 Ответов: 2

Как конструкторы работают внутренне для ASP.NET контроллеры MVC


Всем Привет,

Я уже давно работаю над этим Asp.Net MVC за последние 3-4 месяца и получил вопрос в моей голове, который действительно озадачивает меня.

Я искал то же самое в интернете, но ничего не нашел.

Проблема:
Мы все знаем, что MVC будет работать в соответствии с URL-адресом-сначала он будет искать контроллер, а затем указанное действие и параметр(ы).
Но любой пользовательский контроллер является классом и наследуется от базового класса "контроллер".
Теперь, если я объявлю параметризованный конструктор в своем контроллере. Как его вызвать?

Пример:

Что я уже пробовал:

public MyController : контроллер
{
индекс общественных инт ;

public MyController(int i)
{
индекс = 10;
}

// Действие
public ActionResult someAction()
{
// реализация
}
}

Теперь, как вызвать параметризованный конструктор контроллера?

2 Ответов

Рейтинг:
10

F-ES Sitecore

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

Понимание и расширение фабрики контроллеров в MVC[^]

Скорее всего, вы не хотите\не должны этого делать, однако, вероятно, есть какое-то другое решение, но пока мы не знаем, для чего это нужно и откуда оно берется, трудно сказать.


Member 11072126

Хорошо. Спасибо. Итак, MVC внутренне следует Заводскому шаблону проектирования? Можете ли вы предложить какую-либо статью, если я хотел бы знать, что hoe MVC работает внутренне? Я имею в виду, когда приходит запрос, какой интерфейс или класс он вызывает внутренне и все эти понятия

Рейтинг:
0

Afzaal Ahmad Zeeshan

Я не уверен, следую ли я за вами или нет. Но почему вы вообще хотите иметь контроллер с этим определенным параметром?

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

Кроме того, у вас есть свобода принимать переменные-заполнители в маршрутизации. Я бы сделал то же самое кодирование по-другому, это кажется несколько проще и проще.

public MyController : Controller
{
   public int index;

   public MyController()
   {
   }

   // Action
   [Route("controller/{i}")]
   public ActionResult someAction(int i)
   {
      // implementation
   }
}

Наконец, ASP.NET поддерживает ли он параметры, чтобы понять, как они работают, вы можете узнать больше о внедрении зависимостей, чтобы узнать, как фреймворк будет вводить значения для параметров конструктора. ASP.NET внедрение зависимостей MVC 4 | Microsoft Docs[^]
.net - как задаются параметры конструктора контроллера MVC? - Обмен Стеками Программной Инженерии[^]


Member 11072126

Спасибо за ваш ответ Afzaal. Мне нет такой необходимости передавать параметр в конструктор. Я просто думал об этом, потому что думал, что это тоже класс и могу ли я передать какой-либо параметр через конструктор или нет?
Если я могу передать, то как он будет вызван, если я не передам какое-либо значение в конструктор.
Но мы не создаем какой-либо объект контроллера явно, контроллер и действия вызываются на основе моего пути маршрутизации.
Итак, можно ли создать какой-либо параметризованный конструктор в контроллере? если да, то как его вызвать, а если нет, то почему?