.NET

индекс
121,07

ASP.NET MVC 2: области (areas) — описание, использование

imageПонятие областей (areas) для ASP.NET MVC – это новая концепция. Суть областей сводится к тому, чтобы предоставить возможность разделить чрезмерно большой проект на несколько групп, которые продолжали бы взаимодействовать друг с другом. Например, в компании работает несколько групп разработчиков, которые создают большой проект, включающий в себя: основной сайт, магазин, обзоры товаров, форум, внутренний сайт по администрированию и прочие. Для создания такого проекта в ASP.NET MVC 2 предлагает выделить каждую отдельную часть проекта в область, которые вместе продолжали бы представлять собой один взаимосвязанный проект. Выделение из большого проекта отдельных проектов-областей позволит разным группам разработчиков более независимо разрабатывать свои части приложения.

Концепция областей появилась в ASP.NET MVC 2 Preview 1 в виде областей в решении с несколькими проектами. После выхода ASP.NET MVC 2 Preview 2 применение областей было расширено возможностью создавать области в одном проекте. Рассмотрим оба варианта.

Области для нескольких проектов


При создании решения с использованием областей работающих с помощью нескольких проектов необходимо следовать следующим шагам:
  • создать проект, который будет родительским (или главным) по отношению к проктам-областям;
  • создать проекты-области, например для форума, блога, магазина и т.д. В этих проектах требуется удалить файлы Global.asax, кроме того, можно удалить созданные по умолчанию файлы в папке scripts, поскольку все скрипты будет браться из родительского проекта;
  • добавить ссылки на проекты-области в родительском проекте;
  • создать для каждого из проектов класс наследующий от класса AreaRegistration, в котором перегрузить два элемента: метод RegisterArea и свойство AreaName. RegisterArea должен реализовать логику по регистрированию области в контексте приложения, свойство AreaName должно вернуть название области;
  • в родительском проекте в Global.asax необходимо вызвать метод AreaRegistration.RegisterAllAreas(); для регистрации областей к контексте приложения во время запуска;
  • заключительным шагом, который требуется для успешного запуска проекта с областями, является модификация файлов проекта *.csproj (*.vbproj для проектов на Visual Basic) каждого из проектов. В каждого таком файле необходимо расскомментировать относящиеся к областям строки кода (будет показано ниже).
Рассмотрим шаги немного подробнее. На рис. 1 показана структура решения, в котором содержится три проекта: родительский проект AreasProject и два проекта-области – Forum и Store, которые реализуют логику форума и магазина соответственно.   

image
Рис.1. Структура проекта ASP.NET MVC с областями

В проекте-области Forum создан контроллер ForumController, который реализует три действия: Index, AddPost, EditPost. Точно так же в проекте Store создан контроллер ProductsController с действиями List, AddReview и Details. Для отображения результатов действий созданы соответствующие представления. После создания проектов-областей, в проекте AreasProject были добавлены ссылки на эти проекты.

На рис. 1 вы можете заметить в проектах Store и Forum файл Routes.cs. Этот файл добавлен в проекты для того, чтобы реализовать класс AreaRegistration. Рассмотрим содержимое файла Routes.cs в проекте Store на листинге 1.

Листинг 1. Содержимое файла Routes.cs проекта Store
namespace Store
{
  using System.Web.Mvc;
  using System.Web.Routing;
  public class Routes : AreaRegistration
  {
    public override void RegisterArea(AreaRegistrationContext context)
    {
      context.MapRoute(
        "Store_Default",
        "Store/{controller}/{action}/{id}",
        new {controller = "Products", action = "List", id = ""},
        new string[] { "Store.Controllers" }
      );
    }
    public override string AreaName
    {
      get { return "Store"; }
    }
  }
}


Обратите ванимание, класс Routes наследуется от AreaRegistration, что позволит подсистеме ASP.NET MVC в дальнейшем проинициализировать с помощью него подсистему областей. В классе Routes содержится два перегруженных члена: метод RegisterArea и свойство AreaName.

В RegisterArea поизводится регистрация маршрутов в контексте приложения с областями. С помощью context.MapRoute создается маршрут под названием Store_Default. Последнее значения параметра new string[] { «Store.Controllers» } определяет пространство имен в котором находятся контроллеры сопоставленные данному маршруту.

Перегруженное свойство AreaName возвращает название области. Это имя в дальнейшем используется как ASP.NET MVC так и разработчиком для указания области из которой необходимо вызвать требуемый функционал.

Классы подобные Routes для проекта Store необходимо создать для каждого проекта в решении с областями.

Следующим шагом будет добавление в родительском проекте AreasProject в Global.asax сдедующй строки кода:
protected void Application_Start()
{
  AreaRegistration.RegisterAllAreas();
  RegisterRoutes(RouteTable.Routes);
}


Вызов AreaRegistration.RegisterAllAreas() при запуске приложения позволит ASP.NET MVC инициализировать все имеющиеся области и их маршруты в приложении.

Последним шагом, необходимым для запуска проекта с областями является модификация файлов проекта *.csproj (или *.vbproj, если ваши проекты написаны на Visual Basic) для каждого из проектов в решении. Для того чтобы получить доступ к этим файлам последовательно выгрузите проекты из решения с помощью команды UnloadProject. В контекстном меню на выгруженном проекте выберете Edit***.csproj (рис. 2), где *** — название проекта.

image
Рис. 2. Контекстное меню позволяющее редактировать файл проекта

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

<!-- To enable MVC area subproject support, uncomment the following two lines: -->
и
<!-- If this is an area child project, uncomment the following line: –>

Для родительского проекта необходимо раскомментировать куски кода помеченные:

<!-- To enable MVC area subproject support, uncomment the following two lines: -->
и
<!-- If this is an area parent project, uncomment the following lines: -->

Примечание
Известно, что в следующих релизах ASP.NET MVC 2 действие с редактированием файлов проекта будет излишним. Ожидается, что работа с областями будет поддерживаться на уровне Solution Explorer, что облегчит создание новых областей и проектов на базе них.

Теперь, кода проект подготовлен полностью, можно использовать проекты-области в родительском проекте следующим образом. Видоизменим в файл Site.Master в родительском проекте блок кода списка вкладок так, чтобы он выглядел как на фрагменте:

<ul id="menu">   
 <li><%= Html.ActionLink("Home", "Index", "Home",
             new {area = "AreasProject"}, null)%></li>
 <li><%= Html.ActionLink("Forum", "Index", "Forum",
             new { area = "Forum" }, null) %></li>
 <li><%= Html.ActionLink("Store", "List", "Products",
             new { area = "Store" }, null) %></li>
 <li><%= Html.ActionLink("About", "About", "Home",
             new {area = "AreasProject"}, null)%></li>
</ul>


Обратите внимание, что построение ссылок с помощью Html.ActionLink теперь требует указание области, в которой требуется найти контроллер и действие. Если мы запустим проект, то увидим следующее (рис. 3):

image
Рис.3. Запущенное приложение

Новые вкладки Store и Forum будут работать согласно заданным правилам и отображать представления из проектов-областей.

Области в одном проекте


Если в решении предыдущего примера областей для нескольких проектов включить опцию показа скрытых файлов для родительского проекта, то мы увидим следующую картину (рис. 4).

image
Рис. 4. Скрытые элементы решения

В родительском проекте AreasProject в папке Views/Areas создаются скрытые элементы из проектов-областей. Это требуется для того, чтобы родительский проект самостоятельно отображал представления проектов-областей.

Однако, эта структура скрытых файлов может быть использована и напрямую. В ASP.NET MVC 2 Preview 2 появилась возможность создания решений с одиночными проектами на базе областей. Такие решения содержат только один проект, в котором реализованы все области. На рис. 5 представлена структура одиночного проекта, в котором реализованы те же самые области, которые были реализованы в предыдущем разделе с помощью нескольких проектов-областей.

image
Рис.5. Структура одиночного проекта на базе областей.

Чтобы создать такой проект, по аналогии с предыдущим примером, мы должны создать вместо нескольких проектов иерархию областей в одном проекте. Для этого в корне проекта необходимо создать папку Areas, в которой каждая созданная папка будет являться отдельной областью. На рис. 5 такими папками являются Forum и Store. В них необходимо создать папки Controllers и Views для контроллеров и представлений и реализовать их подобно тому, как мы сделали это в предыдущем разделе. Обратите внимание, что для каждой из папки-области так же наобходимо создать файл Routes.cs с реализацией класса AreaRegistration. Необходимо обновить и Global.asax, добавив в него вызов AreaRegistration.RegisterAllAreas(). После этого вы получите проект аналогичный решению с несколькими областями-проектами.

Приятным отличием разработки единичного проекта на базе областей от решения с несколькими проектами-областями состоит в том, что при создании одиночного проекта ASP.NET MVC на базе областей нет необходимости изменять его файл проекта, так как нет нужды обрабатывать зависимости между проектами. В целом, это несколько упрощает создание решения с областями.

Функционал областей – это полезный механизм, который позволяет разделить в большом решении логику различных частей на составные объекты – области. Вы можете выбрать как области будут представлны в вашем решении: на базе нескольких проектов или же на базе только одного проекта. В любом случае, создание областей не составит труда и позволит вам удобно разделить разнородные функции в приложении.

Дополнение: исходные коды решений с рассмотренными техниками можно загрузить отсюда (требуется Visual Studio 2010 Beta 2). В случае, если решение с несколькими проектами-областями выдаст 404 при переходе на области, перекомпилируйте два проекта-области.

Progg it
_________
Текст подготовлен в ХабраРедакторе
+10
3 ноября 2009, 12:39
13

комментарии (8)

0
mezastel #
Привет, в посте картинки не показываются.

А что касается зон, мне кажется AreaViewEngine уже давно была в SharpArchitecture? Или я с чем-то путаю?
+1
XaocCPS #
fixed, sorry

к сожалению, не могу прокомментировать про AreaViewEngine, не пользовался. В любом случае, сейчас этот функционал из коробки, в следующих релизах будет поддержка в IDE
0
ashmind #
Насколько помню это был хак по посту haacked, а сейчас официальный вариант.
0
VasilioRuzanni #
Не совсем понятно зачем нужны эти области. Почему тот же большой проект не мог просто состоять из простого набора контроллеров ForumController и ProductController?
0
DonSleza4e #
с маленькими проектами пользы мало. Речь идет о крупных, в которых много разноплановых функций. В основном направлено для более комфортной разработки несколькими девелоперами, но это не является догмой — один разработчик и сам может «навести лоск», если сам желает того.

По сути — возможность разделить разнородную функциональность по разным проектам для более комфортного процесса разработки.
0
XaocCPS #
как пример, области могут иметь одноименные контроллеры. скажем форум и магазин могут иметь AdminController, у каждого свой.

Как справедливо заметили, области предназначены для крупных проектов, в которых группы людей работают над разными частями. Вероятно, в большей части мелких проектов области — излишни.
0
skiedr #
Так и не понял, речь идет об аналоге плагинов или же аналоге элиментов(partials)?
0
Kano #
Мы разрабатываем большой сайт и я уже давно подумывал о подобном разделе на подпроекты. Сайт пишем на ASP.NET Web Forms, но думаем переходить на MVC
Очень полезный функционал для разделения труда между несколькими разработчиками.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.