asp.net mvc правильно ли создавать экземпляр контроллера в конструкторе другого контроллера? - PullRequest
0 голосов
/ 01 марта 2010

У меня есть несколько контроллеров, которые будут использовать общую функциональность. Поэтому я разделил эту функцию на отдельный контроллер.

общему контроллеру нужен параметр, определяющий, из какого контроллера он используется, и он должен возвращать представления на основе переданных ему идентификаторов.

Итак, одна идея состоит в том, чтобы создать экземпляр SharedController (int callControllerId) в конструкторе каждого из контроллеров, которые будут его использовать. Затем в методах действия каждого контроллера вызовите методы действия общего контроллера, передав соответствующие идентификаторы и возвращая представления из SharedController в вызывающий контроллер, который будет возвращать представление, которое будет отображено.

Это звучит правильно? Должны ли контроллеры создавать другие контроллеры в MVC?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 01 марта 2010

Абсолютно нет, хотя ваш контроллер наследуется от общего, базовый контроллер довольно распространен.

public KittyController : MySharedBaseController
{

}

Как и Грег Робертс, Грег Робертс отмечает, что хотя ControllerBase является обычным явлением, это не всегда лучшее место для хранения общих функций. MVC имеет много точек расширяемости , и выбор узкого места для вклинивания в вашем коде намного лучше, чем вбрасывание множества вещей в базовый контроллер.

2 голосов
/ 01 марта 2010

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

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

Вот пара вещей, на которые стоит обратить внимание.

  • Композиция почти всегда лучше наследования. Отличная статья об этом
  • Базовый контроллер должен иметь общие методы / свойства, например, у моего есть некоторые свойства получения текущего пользователя и универсальный метод для вызова внешних служб, но не конкретные вещи от наследования контроллеров. Эмпирическое правило, если оно не требуется более чем одному контроллеру, чем, вероятно, не годится базовая реализация.
  • Возможно, что некоторые новые функции MVC 2 могут решить, что вы делаете. Посмотрите на действие рендера.

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

1 голос
/ 01 марта 2010

Контроллеры создаются во время выполнения ASP.NET MVC, и вы никогда не должны создавать их в своем собственном коде. Похоже, вам на самом деле не нужен отдельный контроллер , вам просто нужен другой класс, который вы собираете в контроллере и используете в качестве службы. Это вполне приемлемо. На самом деле, я бы зашел так далеко, что сказал бы, что в общем случае контроллер должен делегировать свою работу другим «служебным» классам и не должен нести большую ответственность (особенно предметную логику) сам по себе.

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

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