Могу ли я установить собственный класс в качестве базового класса по умолчанию для моих контроллеров в ASP.NET MVC3?

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

Есть ли способ добиться этого?


person Vilx-    schedule 15.02.2011    source источник
comment
Речь идет не о MVC IMHO - то, о чем вы говорите, каким-то образом определяет базовый класс по умолчанию для группы классов. И извините, это можно сделать в динамических языках, таких как Python и Ruby, но это невозможно сделать в C#... Конечно, вы, вероятно, могли бы эмулировать такое поведение, возможно, используя DI или отражение. Или использовать какой-нибудь трюк с разрешением прицела, как это сделал Роб Уэст.   -  person rsenna    schedule 15.02.2011
comment
@rsenna, хотя это невозможно сделать на уровне языка/компилятора, ASP.NET MVC предлагает настраиваемые параметры инструментов, которые делают это возможным. Прочитайте мой ответ на вопрос.   -  person marcind    schedule 15.02.2011


Ответы (3)


Вы можете настроить шаблон T4, который будет использоваться при вызове действия «Добавить контроллер». По сути, вам придется скопировать шаблон из C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 3\CodeTemplates\AddController\Controller.tt в '~\CodeTemplates\AddController\Controller.tt` в файле вашего проекта.

Доступна дополнительная информация здесь (прокрутите вниз до "Добавление и настройка шаблонов Scaffold")

person marcind    schedule 15.02.2011
comment
Затем это будет применяться ко всем решениям MVC, что, безусловно, не очень хорошо! - person Rob West; 15.02.2011
comment
Что ж, если вы скопируете файл Controller.tt в свой проект, он будет применяться только к этому единственному проекту. Или вы можете изменить файл в его исходном местоположении, но тогда каждый разработчик, работающий над проектом, должен будет изменить файлы на своей машине. Копирование файла шаблона в проект (хотя иногда и повторяющееся) в настоящее время является лучшим способом добиться этого при поддержке нескольких разработчиков, системы контроля версий и т. д. - person marcind; 15.02.2011
comment
Ву ху! Это сработало! Красивый! Эта функция шаблонов — именно то, чего мне не хватало в старой версии VS2008! - person Vilx-; 16.02.2011
comment
На самом деле такая же техника доступна и в VS 2008. - person marcind; 16.02.2011

Вы можете сделать это, используя пространства имен: создайте класс с именем Controller в том же пространстве имен, что и ваши контроллеры, например:

namespace UI.Controllers
{
    public class Controller : System.Web.Mvc.Controller
    {
        //Code here
    }
}

и тогда стандартные неквалифицированные ссылки на Controller будут ссылаться на ваш базовый класс вместо System.Web.Mvc.Controller.

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

person Rob West    schedule 15.02.2011
comment
Действительно, я тоже предпочитаю давать имена своим классам, которые не конфликтуют с классами фреймворка. - person Vilx-; 16.02.2011

Да, это простая задача. Сначала создайте класс с именем «BaseController», например, который наследуется от Controller. Тогда все ваши контроллеры будут наследоваться от BaseController.

РЕДАКТИРОВАТЬ: я думаю, что использование шаблона T4 для создания вашего контроллера костюма (называемого BaseController или, возможно, Controller - в зависимости от того, что вы предпочитаете) также будет работать. Я видел, как Скотт Хансельман сделал что-то подобное в одном из своих выступлений.

person Kassem    schedule 15.02.2011
comment
ах, я вижу, теперь, когда я прочитал ваш ответ, я лучше понял вопрос. Мое решение работает нормально, но я не уверен, что Vilx захочет реализовать мое или ваше решение. Но, честно говоря, я обычно стараюсь не называть свои классы так же, как в самой среде .NET (или в данном случае ASP.NET MVC), что создает много путаницы, и даже Visual Studio жалуется на это. (Примечание: я только что отредактировал свой пост) - person Kassem; 15.02.2011