Search
Write a publication
Pull to refresh

Castleproject MonoRail: Основы

Reading time6 min
Views1.9K
Привет, Хабр! Я заметил, что здесь как-то незаслуженно обошли стороной такой замечательный 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. Правда я не могу гарантировать, что он полностью рабочий, так как сам я шаблонами для Monorail не пользуюсь.

Из-за всего вышесказанного, остановимся подробнее на создании проекта вторым способом.

Шаг 1. создаем новое ASP.NET приложение.

В этом пустом проекте у нас нет необходимости в Default.aspx. Но не спешите его удалять. Для того, чтобы при вводе в строку браузера www.mysite.com мы успешно перенаправлялись на нашу главную страницу mysite.com/home/index.rails, нам этот файл все-таки пригодится. Дизайнер и .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 — это собственно путь к главной странице сайта. Естественно, разрешение rails можно поменять, но в примерах я буду испольтзовать его.

Шаг 2.Конфигурация

Добавим следующие сборки из скачанных нами:
  • Castle.Core
  • Castle.Monorail.Framework
  • Castle.Monorail.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>


Сначала идет регистрация секции monorail. В ней мы указываем, откуда нужно грузить контроллеры для нашего приложения. Так как мой пример простой, то контроллеры находятся в той же сборке и соответственно указано ее имя. Далее в этой же секции регестрируем наш движок для рендеренга и указываем корень для дерева каталогов представлений ( в нашем случае это «Views»). И на последок добавляем обработчик на выбранное нами расширение ( rails ) и запрещаем доступ к vm файлам ( это расширение используется для шаблонов NVelocity и нам не за чем, чтобы к ним был доступ извне).

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

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

Структура папок

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

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


Проект-то мы создали, но какое от этого удовольствие, если еще ничего не работает?
Давайте создадим контроллер, который, например, будет выводить список книг.
Для этого нам понадобится модель Book, которую мы поместим в папку Models. Естественно, что в реальных проектах моедли будут находиться в отдельных сборках, но не в нашем простом примере. Вот реализация класса 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 = "Alice in Wonderland",
                     Author = "Lewis Carroll"
                   },
                 new Book
                   {
                     Title = "Pinocchio",
                     Author = "Carlo Collodi"
                   },
                 new Book
                   {
                     Title = "I, Robot",
                     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, все книжки. Это вполне соответствует духу skinny controller/fat model, когда вся логика находится в модели, а контроллер отвечает лишь за передачу данных между представлением и моделью.

Осталось создать собственно html код. Его мы поместим в папке view и подпапке home. Таким образом мы разграничиваем представления в зависимости от контроллера, которому они принадлежат. Там мы создаем 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 для прохода по нашей коллекции книг books. Она здесь доступна как обычная переменная. То есть все, что мы записываем в PropertyBag в контроллере, становится переменными в представлении. В остальном же, этот файл — обычный html.
Вот ваш первый простеший пример на Monorail и готов.
Теперь нужно его запустить. Если вы добавили этот проект как виртуальную директорию в IIS, то он по умолчанию, естественно не умеет работать с разрешением .rails. Чтобы его научить это делать просто в маппинги на .rails разрешение добавьте стандартную aspnet_isapi.dll. Путь к ней можно посмотреть, например, в том же маппинге для .aspx файлов. Главное, не зубадьте при добавлении маппинга убрать чекбокс Check that file exists, потому что физически ваших .rails фалов не существует, а IIS будет пытаться их найти.

Добавление маппинга на расширение

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

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

Ссылка на проект Castle — www.castleproject.org
Tags:
Hubs:
Total votes 37: ↑25 and ↓12+13
Comments18

Articles