Castleproject Monorail: Основы

Привет, Хабр! Я заметил, что такой замечательный MVC-фреймворк для .

NET, как Monorail, здесь как-то несправедливо проигнорировали.

Поэтому, собственно, я и постараюсь восполнить этот пробел.

Сначала имеет смысл коснуться азов: создания шаблона проекта и простого примера, чтобы увидеть, как все это работает. Итак, начнем! Просто хочу предупредить, что это моя первая статья и поэтому некоторые огрехи вполне допустимы.

Буду рад выслушать конструктивную критику.

Вы можете скачать бинарные файлы здесь: sourceforge.net/projects/castleproject/files/MonoRail/2.0/Castle.MonoRail-2.0.0.zip/download Естественно, вам не понадобятся все dll, которые есть в архиве; мы возьмем только самое необходимое.



Создание проекта.

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

Первый способ, насколько мне известно, потерял свою актуальность после того, как проект Castle перестал распространяться в виде отдельного MSI-файла.

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

На всякий случай вот ссылка на готовый шаблон тестового проекта для VS2008: tech.wowkhmer.com/wp-content/uploads/2008/11/CastleMonoRailProject.zip .

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

Учитывая все вышесказанное, давайте подробнее рассмотрим создание проекта вторым способом.



Шаг 1. Создайте новое приложение ASP.NET.
В этом пустом проекте нам не нужен Default.aspx. Но не спешите удалять его.

Для того, чтобы при входе в строку браузера www.mysite.com мы были успешно перенаправлены на нашу домашнюю страницу mysite.com/home/index.rails, этот файл нам все равно понадобится.

Мы удалим файлы Designer и .

cs, а сам default.aspx перенесем примерно так:

  
  
  


<%@ Page Language="C#" %> <script runat="server"> protected override void OnLoad(EventArgs e) { Response.Redirect("~/home/index.rails"); base.OnLoad(e); } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd "> <html xmlns=" http://www.w3.org/1999/xhtml "> <head> <title>Welcome</title> </head> <body> <p> If you were not redirected, please <a href="home/index.rails">click here</a>.

</p> </body> </html>

Здесь home/index.rails — это реальный путь к главной странице сайта.

Естественно, разрешение рельсов можно изменить, но в примерах я буду использовать именно это.



Шаг 2. Настройка
Добавим следующие сборки из тех, что мы скачали:
  • Замок.

    Ядро

  • Замок.

    Монорельс.

    Каркас

  • Замок.

    Монорельс.

    Framework.Views.NVelocity

В качестве движка для рендеринга представлений мы будем использовать NVelocity, хотя в Monorail нет никаких ограничений на это и, более того, другие движки, такие как Brail, например, идут напрямую с ним.

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

Не знаю, как обстоят дела сейчас, но буду рад услышать.

Вносим изменения в web.config. В моем проекте получилось примерно так:

<Эxml version="1.0" encoding="UTF-8"?> <configuration> <configSections> <section name="monorail" type="Castle.MonoRail.Framework.Configuration.MonoRailSectionHandler, Castle.MonoRail.Framework" /> </configSections> <monorail> <controllers> <assembly>TestMonorailApp</assembly> </controllers> <viewEngines viewPathRoot="Views"> <add type="Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine, Castle.MonoRail.Framework.Views.NVelocity" /> </viewEngines> </monorail> <system.web> <compilation debug="true" /> <httpHandlers> <add verb="*" path="*.

rails" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" /> <add verb="*" path="*.

vm" type="System.Web.HttpForbiddenHandler" /> </httpHandlers> </system.web> </configuration>

Сначала идет оформление участка монорельсовой дороги.

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

Так как мой пример простой, то контроллеры находятся в одной сборке и соответственно указано ее название.

Далее в этом же разделе мы регистрируем наш движок рендеринга и указываем корень дерева каталогов представлений (в нашем случае «Представления»).

И наконец, добавляем обработчик выбранного нами расширения (rails) и запрещаем доступ к файлам vm (это расширение используется для шаблонов NVelocity и у нас нет смысла иметь к ним доступ извне).



Шаг 3. Остаётся только создать структуру папок.

У меня это так, как показано на картинке.



Castleproject MonoRail: основы

Готово, шаблон проекта создан!

Добавляем простой функционал

Мы создали проект, но что в этом интересного, если пока ничего не работает? Давайте создадим контроллер, который, например, будет отображать список книг.

Для этого нам понадобится модель «Книга», которую мы поместим в папку «Модели».

Естественно, в реальных проектах модели будут располагаться в отдельных сборках, но не в нашем простом примере.

Вот реализация класса Book:

public class Book { public String Title { get; set; } public String Author { get; set; } public static IList<Book> FindAll() { return new List<Book> { new Book { Title = "Алиса в стране чудес", Author = "Lewis Carroll" }, new Book { Title = "Буратино", Author = "Carlo Collodi" }, new Book { Title = "Я робот", Author = "Isaac Asimov" } }; } }

Метод FindAll просто возвращает нам коллекцию из трех книг, которую мы будем использовать в нашем тестовом примере.

Теперь давайте создадим контроллер.

Поскольку мы указали путь по умолчанию в deafult.aspx как home/index.rails, мы разместим на этой странице список наших книг.

Соответственно, в папке Controllers создаем HomeController, который унаследован от SmartDispatcherController, входящего в состав Monorail. Строго говоря, в нашем примере возможно наследование от Controller, поскольку в нашем примере мы не будем использовать привязки, но в реальных проектах функционал SmartDispatcherController очень часто все еще востребован.

Там мы создаем метод Index, который будет вызываться при вводе mysite.com/home/index.rails в браузере.

Реализация класса выглядит следующим образом:

public class HomeController : SmartDispatcherController { public void Index() { PropertyBag["books"] = Book.FindAll(); } }

Здесь мы просто загружаем все книги в контейнер, доступный во View. Это вполне соответствует духу модели «тонкий контроллер/толстая», где вся логика находится в модели, а контроллер отвечает только за передачу данных между представлением и моделью.

Остается только создать настоящий html-код. Мы поместим его в папку просмотра и домашнюю подпапку.

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd "> <html xmlns=" http://www.w3.org/1999/xhtml "> <head> <title>Test Application</title> </head> <body> <h3>List of books:</h3> #foreach($book in $books) #each <li> $book.Title by $book.Author </li> #beforeall <ul> #afterall </ul> #end </body>

Здесь мы используем макрос foreach для перебора нашей коллекции книг.

Здесь она доступна как обычная переменная.

То есть все, что мы пишем в PropertyBag в контроллере, становится переменными в представлении.

В противном случае это обычный HTML-файл.

Вот ваш первый простой пример монорельсовой дороги, и все готово.

Теперь нам нужно его запустить.

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

rails. Чтобы научить его этому, просто добавьте стандартный aspnet_isapi.dll в сопоставление разрешений .

rails. Путь к нему можно найти, например, в том же сопоставлении для файлов .

aspx. Главное — не беспокоиться о снятии флажка «Проверить наличие файла» при добавлении сопоставления, поскольку ваши файлы .

rails физически не существуют, и IIS попытается их найти.



Castleproject MonoRail: основы

Думаю, для начала этого достаточно.

Конечно, эта статья не содержит еще многих полезных функций, таких как:

  • Работа с базой данных
  • Автоматическая привязка данных от запроса к контроллеру
  • Валидации
  • Рутов
  • Шаблоны, Помощники, Компоненты для презентации
  • И многое другое.

Не вижу смысла сейчас обо всем писать.

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

Ссылка на проект Castle - www.castleproject.org Теги: #.

NET #монорельс #castleproject #.

NET

Вместе с данным постом часто просматривают: