Pull to refresh

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

Reading time7 min
Views14K
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
Tags:
Hubs:
Total votes 28: ↑19 and ↓9+10
Comments8

Articles