В связи с тем, что миграции закончены, константы понятно как делать, а последний макрос уже сделал hardcase, предлагаю обсудить нечто важное, но выходящее за роадмап.
View engine. Дефолтный aspx достаточно неуклюж. Попробую перечислить его недостатки:
Неуклюжий layout engine, собрать страницу из кусочков достаточно геморойно, все что у нас есть это master page и рендер контролов.
Неудобный синтаксис включения кода, достаточно сделать пару циклов и условий чтобы страница стала очень плохо читаемой.
У меня зреет несколько вариантов, которые я хотел бы обсудить. Для примера возьмем простейшую вьюху:
http://code.google.com/p/nemerleonrails/source/browse/Demo/NRails.Demo/Views/Home/Index.aspx
Движок который я сейчас применяю в MVC, о нем я уже рассказывал здесь, особо повторяться не буду, кто желает узнать поближе —
http://sparkviewengine.com/
<content name="Title">Home Page</content>
<h1>!{model.Message}</h1>
<p>Taxonomies list
<ul>
<li each='tax in model.Taxonomies'>!{tax}</li>
</ul>
Плюсы:
Очень читабельно и декларативно
Движок уже поддерживает питон и руби, так что есть хороший шанс отделаться малой кровью при создании Nemerle аналога. Например Spark.Ruby это всего 13 cs файлов, < 40кб кода.
Является надмножеством aspx, что очень облегчает переход на него.
Легко расширяем.
Минусы:
Непонятные перспективы, автор вроде бы ушел в майкрософт и там что-то делает в ASP.NET команде. Особого развития нет, хотя движок выглядит вполне законченным и легко расширяемым.
Никакого контроля корректности html и автоескейпинга, хотя достаточно простой ручной ескейпинг.
Интеграция в IDE. Есть только для 2008 студии, нет данных, что кто-то портирует под 2010, врядли она будет работать с языками отличными от C#. Для меня это большой и жирный минус, изза которого я вообще поднимаю эту тему, а не продумываю детали реализации спарка.
Тут я описывать не буду особо, т.к. сам пока имею только печальный опыт попыток понять логику StringTemplate.
[StringTemplateGroup]
class Index_Home : View
{
public title() : string {"Home Page"}
[view] public view(model : Model) : string
{
<#
<h1>!{model.Message}</h1>
<p>Taxonomies list
<ul>
..$(model.Taxonomies; "\n";taxonomy)
</ul>
#>
}
public taxonomy(name : string) : string {$"<li>$name</li>"}
}
Плюсы:
Минусы:
кошмарная читабельность, имхо
слабая поддержка IDE внутри шаблонов
достаточно большое количество синтаксического мусора
Некий DSL на макрах, напоминающий haml. Python like indent + несколько несложных макров и код на nemerle начинает очень походить на haml.
http://haml-lang.com/
[View] class Home_Index
public title() : void
t "Home Page" // t макрос вывода обычного текста, автоэскейпинг
public view(model : Model) : void
h1 model.Message
p
t "Taxonomies list"
ul
foreach (tax in model.Taxonomies)
li tax
Плюсы:
Это действительно валидный код на nemerle, легко использовать все возможности языка, полная поддержка IDE.
Достаточно прост в реализации.
Очень легко расширяем
Гарантирует валидный xml, и достаточно просто реализуется автоэскейпинг
Если кому-то захочется красиво отформатированный html, здесь это будет сделать очень просто.
Недостатки:
Непривычный вид будет отталкивать новичков.
Динамическая компиляция внесет некие неявные особенности, которые придется учитывать. В спарке этой проблемы нет, он не выглядит как статически компилируемый код в проекте. К тому же для нормальной поддержки IDE его придется так же компилировать в проект. Впрочем для продакшена это неплохой бонус по времени раскочегаривания и объему памяти приложения (спарк тоже умеет компилировать все вьюхи в отдельную сборку).