Частичный класс для контроллера - PullRequest
13 голосов
/ 13 марта 2012

Можно ли создать частичный класс для контроллера в MVC?

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

Если я могу сделать что-то иное, кроме как, дайте мне знать.

Спасибо Alok Shah

Ответы [ 4 ]

14 голосов
/ 13 марта 2012

Да, вы можете использовать частичный класс - компилятор просто объединяет их все во время компиляции, чтобы создать один.

Однако вы упоминаете, что хотите «распространять» код - если код должен идтив несколько проектов тогда частичные вычисления не помогут.

Вместо этого вы можете создать базовые классы контроллеров (которые наследуются от System.Web.Mvc.Controller в проекте библиотеки классов с необходимыми методами действия, а затем просто использовать маршрутизацию для маршрутизациианалогичные URL для разных контроллеров. Вот ссылка на учебник Asp.Net «Создание пользовательских маршрутов» , который может быть полезен для этого. Я настоятельно рекомендую просмотреть оставшуюся часть учебника, если есть другиеосновные аспекты MVC, в которых вы не уверены. Он не охватывает все, но делает основы.

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

Таким образом, "Reports/Customers" может маршрутизировать к CustomerReportsController, а "Reports/Orders" может маршрутизировать к OrdersReportsController:

routes.MapRoute("CustReports",
  "Reports/Customers/{action}",
  new { controller = "CustomerReports", action = "Index", id = "" } );

routes.MapRoute("OrderReports",
  "Reports/Orders/{action}",
  new { controller = "OrdersReports", action = "Index", id = "" } );

Это наиболее упрощенный подход к этой проблеме - но я думаю, что использование Области (ссылка на пошаговое руководство по MSDN), скорее всего, также будет применимо, и в этом случае вам может не понадобиться вообще использовать маршрутизацию, потому чтомаршрут по умолчанию, вероятно, сделает все это.

6 голосов
/ 13 марта 2012

Конечно!

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

0 голосов
/ 13 марта 2012

«Если я могу сделать что-то другое, кроме как, дайте мне знать»

Как насчет:

  • Абстрагирование «делающих» частей в различные генераторы отчетов для отдельных типов отчетов, каждый из которых соответствует интерфейсу. Эти генераторы отчетов будут классами, расположенными вне уровня MVC приложения.
  • Очистите контроллер, чтобы зависимости (генераторы отчетов) были вставлены в конструктор, используя Ninject, StructureMap или Castle Windsor
  • Очистка всего кода генерации отчетов из контроллера и от конкретных реализаций абстракций генератора отчетов

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

0 голосов
/ 13 марта 2012

Да. Частичные классы - это на самом деле просто особенность языка, а скомпилированный класс - это обычный класс .NET, как и любой другой.

Я бы предложил, однако, разделить контроллер на несколько контроллеров, чтобы обеспечить правильное разделение задач (если у вас такой большой класс, что вам нужно разделить его на несколько файлов, то, безусловно, пахнет плохо . )

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