Альтернативный MVC Framework на ASP.NET: FubuMVC

Введение

Почему же альтернативный? Всё просто, данный framework пишется силами выдающихся участников ALT.NET community, а именно:

Jeremy Miller, Chad Myers, Mark Nijhof, Ryan Kelley, и Joshua Flanagan.

FubuMVC не имеет никакого отношения к ASP.NET MVC Framework, кроме того, что так же построен поверх ASP.NET и реализует паттерн Front-Controller. Название FubuMVC строится из акронима “For us by us” и аббривеатуры MVC (кто ещё не знает, что это значит Model-View-Controller ?). Проект был инициирован по причине недовольства вышеперечисленных личностей архитектурными решениями, принятыми в ASP.NET MVC. Сказать, по правде, по прошествии года, после старта проекта, он не утратил своей элегантности и простоты в подходах.

FubuMVC вносит несколько непривычное понимание Controller’а. Теперь это не просто некоторый класс, теперь это больше логическая связность некоторых методов. Это раскрывает более широкие возможности для настройки специфичного поведения Controller’а, к примеру, обработки ошибок, реализации правил кэширования, определения типа возвращаемых значений. К тому же возможность динамического объединения вызовов Action’ов уже является удобным механизмом к расширению. Далее мы более подробно поговорим об особенностях этой реализации в FubuMVC.

В качестве View Engine (в данном случае является лишь определением и не имеет отношения к ASP.NET MVC View Engine) используется механизм рендринга WebForms (проще говоря FubuPage, которая является View в FubuMVC, наследует от System.Web.UI.Page), но имеется возможность в подключении всех существующих в ASP.NET MVC ViewEngine’ов, примером тому может быть реализация SparkViewEngine.

Конечно же уместным будет вопрос, а зачем же нужен “другой” MVC Framework, с меньшим количеством участников проекта, с меньшим вниманием со стороны разработчиков, с меньшим количеством тестеров и прочими атрибутами mainstream проектов.

В основу проекта FubuMVC его создатели заложили больше возможностей для кастомизации проекта под прикладные нужды, а так же конвенциям (соглашениям) относительно настройки и расширяемости. Причём конвенции должны покрывать основные и типичные нужды приложения, коих в разработки решений достаточно большое количество. Какие-либо дополнительные разработки будут инициировать собой появление дополнительных модулей.

ScreencastsАналогичные конвенции (соглашения) существую в известном всем MVC Framework на Ruby: Ruby On Rails. На своей практике разработки под Ruby On Rails я неоднократно убеждался, что данные конвенции действительно позволяют снизить сложность и количество написанного кода. Примером тому может служить ORM Active Record с его соглашениями касательно преобразования объектов в таблицы реляционной базы данных, а так же соглашение, относительно хранения конфигурации в формате YAML.

Официальный сайт проекта: http://fubumvc.com/

FubuMVC на GitHub: http://github.com/darthfubumvc/fubumvc

Первое погружение

Начнём с конвенций именования и структуры проекта. Вся работа с настройкой приложения FubuMVC ведётся через некоторый DSL, стиль конфигурирования очень близок к работе с FluentNhibernate.

public class HelloWorldFubuRegistry : FubuRegistry
{
    public HelloWorldFubuRegistry()
    {
        IncludeDiagnostics(true);

        Applies.ToThisAssembly();

        Actions
            .IncludeTypesNamed(x => x.EndsWith("Controller"));

        Routes
            .IgnoreControllerNamespaceEntirely()
            .ConstrainToHttpMethod(action => action.Method.Name.EndsWith("Command"), "POST")
            .ConstrainToHttpMethod(action => action.Method.Name.StartsWith("Query"), "GET");

        Views
            .TryToAttach(x=>
            {
                x.to_spark_view_by_action_namespace_and_name(GetType().Namespace);
                x.by_ViewModel_and_Namespace_and_MethodName();
                x.by_ViewModel_and_Namespace();
                x.by_ViewModel();
            });

        Output.ToJson.WhenCallMatches(action => action.Returns<AjaxResponse>());

        HomeIs<HomeInputModel>();
    }
}

Исходя из данной конфигурации IoC-container’а нетрудно догадаться о следующем:

  • Все классы, оканчивающиеся на “Controller” будут зарегистрированны в качестве Controller
  • Все запросы, оканчивающиеся на “Command” должны будут приниматься POST’ом, а начинающиеся на “Query” GET’ом
  • Все View будут заполняться соответствующими по именованию ViewModel
  • Весь вывод, возвращающий тип AjaxResponse будет серилизоваться в JSON

В качестве IoC-container’а в FubuMVC выбран StructureMap. Выбор не случаен, т.к. фактически StructureMap является старейшим IoC/DI-container’ом. Начало разработки датировано июнем 2004ого года и велось Jeremy D. Miller, так же и участником проекта FubuMVC.

Второе погружение

Давайте рассмотрим несколько примеров приложений на FubuMVC

Первое из них http://github.com/DarthFubuMVC/fubumvc-examples/tree/master/src/Actions/ControllerActionStyle/

Начнём, с того, что проверим его работоспособность:

image

В namespace’е SimpleWebsite.Core определена наша модель предметной области, а именно Movies, работе с которыми и просвещенно приложение.

В SimpleWebsite.Controllers определен единственный Controller и View, работу которых мы и видим на рисунке выше.

Давайте разберемся с MoviesController. Судя по его конструктору нетрудно догадаться, что DependencyInjection мы получаем out-of-box без каких-либо переопределений Controller Factory:


private readonly IRepository _repository;

public MoviesController(IRepository repository)
{
    _repository = repository;
}

Метод List() является “списочным” и предоставляет нам доступ к ViewModel


public ListMoviesViewModel List()
{
    return new ListMoviesViewModel {Movies = _repository.Query<Movie>()};
}

Стоит обратить внимание на конвенцию именования в данном случае. Под ViewModel (читается так же как PresentationModel) понимается адаптированная для представления модель, что подчеркивает SoC в реализации FubuMVC. View в данном случае будет строго типизировано на  этот тип:

 public class List : FubuPage&lt;ListMoviesViewModel&gt;   <br />{}

Метод Add() попадает под правило обработки AjaxResponse, следовательно вернется на страницу в виде JSON, где будет радужно встречен jQuery обработчиком.

image

Аналогичная ситуация с методом Remove().

Стоит обратить внимание на конвенцию именования принимаемых данными методами типов:

AddMovieInput, RemoveMovieInput

Наименования данных классов указывают на направление данных, т.е. их ввод с запросом. С помощью этих типов на View мы определяем Url для обработки соответствующих Action’ов Controller’а:

<%= Get<IUrlRegistry>().UrlFor(new AddMovieInput()) %>

FubuMVC реализует 3 модели обработки запросов:

  1. Controller / Action Привычный для ASP.NET MVC Framework способ. Определяется некоторый тип — Controller, который содержит в себе соответствующие методы — Action’ы. Данный пример был рассмотрен выше.
  2. Controller-less Actions (HandlerStyle) Данный способ подразумевает под собой “обезличенные” Action’ы. т.е. без привязки к какому-либо Controller’у. Правила нахождения Action’ов описываются Policy, которые можно описывать и добавлять в коде.
  3. REST-like (EndPointStyle) Этот способ близок к предыдущему, однако, в отличии от него реализует не только метод Execute, а все методы, необходимые для REST взаимодействия, каждый метод Get(), Post(), Put(), Head() в дальнейшем будет соответствовать типу HTTP запроса:
var httpVerbs = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
    {"GET", "POST", "PUT", "HEAD"};

Погружаемся далее

Как вы уже догадались, FubuMVC славится своими возможностями для расширения. Предлагаю ознакомиться с ещё одним примером: http://github.com/DarthFubuMVC/fubumvc-examples/tree/7c4b2165aedb6754a01538aee956e29d4060654c/src/Outputs/VaryByAcceptHeader

В данном примере рассматривается вариативность формата возвращаемых данных от параметра запроса, причём вы можете с легкостью добавить новый формат данных.

Этот пример практически ни чем не отличается от рассматриваемого, раннее, за тем лишь исключением, что в классе

VariableOutputConvention : IConfigurationAction

мы регистрируем интересующие нас возвращаемые типы, а так же указываем дополнительный Behavior для рендринга страницы:

RenderVariableOutput : BasicBehavior

После чего достаточно только заполнить интересные вам Movies http://localhost:59187/movies/list и попросить вернуть их в JSON http://localhost:59187/movies/list?renderformat=json или в XML http://localhost:59187/movies/list?renderformat=xml

Данный пример наглядно иллюстрирует точки расширения FubuMVC для любых нужд.

Диагностика

По адресу http://localhost:59187/_fubu вас будет ждать небольшой сюрприз, а именно – диагностическая утилита для FubuMVC.image

C её помощью вы сможете просматривать все зарегистрированные в вашем приложении

  • Chains – цепочки поведения, так называются логические связи между маршрутами и Action’ами. О цепочках можно посмотреть все обертки и возвращаемые значения.
  • Routes – показывает все зарегистрированные маршруты, и связанные с ними Action’ы, тип выводимых данных и цепочки поведения.
  • Actions – зарегестрированные в приложении Action’ы, их маршруты и возвращаемые значения
  • Inputs – возможные типы и способы ввода в вашем приложении со стороны запросов

Заключение

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

Материалы

FubuMVC Contrib http://code.google.com/p/fubumvc-contrib/

Front Controller http://msdn.microsoft.com/en-us/library/ms978723.aspx

FubuMVC — Front Controller style framework  http://blog.fohjin.com/blog/2009/2/21/FubuMVC_Front_Controller_style_framework

FubuMVC Google Group http://groups.google.com/group/fubumvc-devel?pli=1

Ещё один MVC Framework на ASP.NET OpenRasta http://trac.caffeine-it.com/openrasta

Соглашение относительно настройки http://msdn.microsoft.com/ru-ru/magazine/dd419655.aspx


MonoDevelop – Разрабатываем ASP.NET MVC приложения на Mac OS X

После релиза preview ASP.NET MVC MonoDevelop addin, я решил попробовать его на Маке.

Хотя MonoDevelop 2.0 на Маке до сих пор в alpha-врсии, он получше того, что было в версии 1.0. Помимо проблем с перерисовкой GTK+ , основными проблемами в Мак-интеграции являются реализация Ctrl-Click, меню верхнего уровня и Мак шоркатов. Сделать в MonoDevelop полноценную поддержку Мака –это наша цель в MonoDevelop 2.2.

Я скачал Mono 2.4 и MonoDevelop 2.0 для маков (alpha версию), установка подобна установки аналогов в Linux, немного отличается парочкой предупреждений во время установки, но работает это безупречно!

Running an ASP.NET MVC app in MonoDevelop on the Mac

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

Оригинал

http://davidhayden.com/blog/dave/archive/2009/05/06/MonoDevelopMac.aspx

http://mjhutchinson.com/journal/2009/04/04/monodevelop_aspnet_mvc_mac

http://tirania.org/blog/archive/2009/May-05-1.html


Звучит заманчиво: Django на IronPython

def Introduce():

Дорогие мальчики и девочки, меня (как позже оказалось не только меня) интересует веб-индустрия и всё, что с ней связано, соответственно хочется вкусить разнообразных технологий, одной из них является известный фреймворк DjangoimageИм и хочется заняться. Думаю, не стоит говорить, о том, что я .NET-разработчик, в связи с чем Python в чистом виде использовать не очень хочется, но хочется попробовать IronPython в деле. Тогда вполне очевидно, что Django на .NET должен являться ASP.NET приложением.

def WSGI():

Здесь нам нужно знать, что такое WSGI:

WSGI (англ. Web Server Gateway Interface, произносится виски) — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, обычно из каталога cgi-bin, и самим веб-сервером, например, Apache.

Дополнительная информация: PEP 333

И нам безусловно повезло, т.к. есть готовая имплементация WSGI для ASP.NET: NWSGI – выполнена как ASP.NET 2.0 HttpHandler на IronPython.

Что примечательно, мало того, что NWSGI интегрируется с IIS и позволяет работать с сессиями, кешем и управлением пользователями, он интегрируется даже с графической средой управления IIS 7!

Это ещё не всё, NWGSI умеет также работать с Cassini (веб-сервер Visual Studio).

Думаю Вам, ровно как и мне, не терпится поработать с этим.

def PrepareIIS():

Итак, что нам необходимо:

  • IronPython 2.0
  • NWSGI 1.0
  • Огромное желание сделать что-нибудь особенное на этом.

Для установки из пакета NWSGI копируем пример HelloWorld в папку C:\inetpub\wwwroot\HelloWorld (либо другой путь для ваших IIS приложений). Из этого же пакета копируем NWSGI.dll в папочку HelloWorld\bin (если пользовались инсталлятором, то в этом нет необходимости, т.к. она уже в GAC’е).

Далее из пакета IronPython 2.0 копируем в каталог HelloWorld\bin следующие сборки:

  • IronPython.dll
  • IronPython.Modules.dll
  • Microsoft.Scripting.Core.dll
  • Microsoft.Scripting.dll

Наша папочка HelloWorld должна выглядеть следующим образом:

HelloWorld\

  • bin\
    • NWSGI.dll (optional)
    • IronPython.dll
    • IronPYthon.Modules.dll
    • Microsoft.Scripting.Core.dll
    • Microsoft.Scripting.dll
  • hello.wsgi
  • Web.Classic.config
  • Web.Integrated.config

Далее, если у нас ISS 7.0, то тогда копируем Web.Integrated.config в Web.config, иначе Web.Classic.config в Web.config.

Далее добавляем приложение на IIS, это можно сделать, как через графическое меню, так и воспользоваться консолью:

%systemroot%\system32\inetsrv\appcmd add app /site.name:"Default Web Site" /path:/hello /physicalPath:C:\inetpub\wwwroot\HelloWorld

Если же у вас IIS 6, то путь один – через графическое меню, а так же необходимо будет ассоциировать *.wsgi с ASP.NET ISAPI фильтром (по аналогии с *.aspx)

Теперь идём по адресу http://localhost/hello/hello.wsgi. И видим грациозное: "Hello, World!", yeah!

def InstallDjango():

Установить Django можно с помощью команды:

ipy setup.py install

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

ipy manage.py startapp AppName

ipy manage.py startproject ProjName

К сожалению, мне не хватило навыков для того, чтобы запустить django-приложение под NWSGI.

def SqlServer():

Подключить Django к Microsft SQL Server 2005 и выше можно с помощью следующей библиотеки:

http://code.google.com/p/django-mssql/

Так же можно почитать о подключении здесь: http://blogs.msdn.com/dinoviehland/archive/2008/03/17/ironpython-ms-sql-and-pep-249.aspx

def GetGratitude():

Огромную благодарность за выполненную работу хочу выразить Jeff Hardy и советую ознакомиться с его работами:


ASP.NET MVC Release Candidate 2

Введение

Вчера состоялся релиз ASP.NET MVC RC2, скачать можно здесь.

Основные отличия

  • Зависимость от .NET 3.5 SP1 во время установки (теоритически возможно установить на машину без .NET 3.5 SP1 http://haacked.com/archive/2008/11/03/bin-deploy-aspnetmvc.aspx)
  • Опция “серверной установки” (на машину без Visual Studio), с помощью параметра:

msiexec /i AspNetMVC1-RC2.msi /l*v .\mvc.log MVC_SERVER_INSTALL="YES"

  • Инсталятор устанавливает сборку System.Web.Mvc.dll в GAC, а так же копирует её в папку

%ProgramFiles%\Microsoft ASP.NET\ASP.NET MVC 1.0 RC2\Assemblies\

Так же пофиксины некоторые баги. Подробнее читать http://go.microsoft.com/fwlink/?LinkId=137662

Конфликтует с Add-in’ами Visual Studio: PowerCommands, Clone Detective


Codeplex: Scrum Dashboard

Введение

Те кто практикует Scrum, ну или хотя бы читал литературу по Scrum, должны знать что такое Scrum Dashboard (“Доска задач”). Из моего опыта обычно для синхронизации того, что висит в её качестве у Вас на стенке, либо стоит рядом с ней, используют wiki-узлы.

Однако я не раз задумывался о том, как хорошо бы было если бы электронный вариант (написанный к примеру на Silverlight) был точной копией этой доски. Конечно я даю себе отчёт в том, что никакая электронная версия не заменит того, вокруг чего ведутся “живые” дискуссии, но всё таки, неплохо бы было иметь копию всегда перед глазами, если географически ты удален от доски.

Суть

 

Ну и конечно, всё, что можно придумать, можно так же попробовать найти на Codeplex.

FileDownload[1]

Сайт проекта http://www.codeplex.com/scrumdashboard

Приложение выполнено на ASP.NET 3.5 SP1.

Используемые технологии:

  • ASP.NET Ajax
  • Ajax Toolkit
  • Ajax web services
  • Entity Framework
  • SQL Server

Все данные хранятся в Team Foundation Server 2008, с установленными шаблонами “the Scrum for Team System version 2”, используя доступ по API TFS веб-сервисов, так же реализованна RSS-синдикация.

Материалы

 

  1. Скачать приложение можно здесь http://www.codeplex.com/scrumdashboard/Release/ProjectReleases.aspx?ReleaseId=16957
  2. Начать изучать Scrum & XP можно с этой книги https://butaji.wordpress.com/2008/12/02/scrum-и-xp-заметки-с-передовой/

Цикл статей о N-уровневой реализации Веб-приложений на основе ASP.NET 3.5

Введение

 

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

Содержание

 

Хотелось бы обратить внимание на цикл статей, написанных Imar Spaanjaars, подробно описывающих создание многоуровневых приложений на ASP.NET 3.5, а так же сопровожденных большим количеством практических примеров.

Previous Series
Building Layered Web Applications with Microsoft ASP.NET 2.0 — Part 1 (3)
Building Layered Web Applications with Microsoft ASP.NET 2.0 — Part 2 (4)
Building Layered Web Applications with Microsoft ASP.NET 2.0 — Part 3 (5)
Custom Sorting with N-Layer Design Classes and the GridView (6)

Current Series
N-Layered Web Applications with ASP.NET 3.5 Part 1: General Introduction (7)
N-Layered Web Applications with ASP.NET 3.5 Part 2: Introducing the Validation Framework (8)
N-Layered Web Applications with ASP.NET 3.5 Part 3: Advanced Validation Topics (9)
N-Layered Web Applications with ASP.NET 3.5 Part 4: Sorting, Paging and Filtering (10)
N-Layered Web Applications with ASP.NET 3.5 Part 5: Dealing with Concurrency
N-Layered Web Applications with ASP.NET 3.5 Part 6: Security


Что такое ALT.NET?

Введение

По многочисленным WTF от коллег, хотел бы вкратце прояснить, а что же это такое. А дальше решайте сами, интересно Вам это или нет.

Содержание

 

ALT.NET — Альтернативные инструменты и подходы к разработке на .NET.

Инструменты и подходы перечислены ниже в табличке HOTorNOT.

Hot Not
Castle, ActiveRecord,
NHibernate
DataSets, Dataset Designer, Entity Framework, MS Application Blocks
MVC,NUnit,MonoRail Web Forms, SCSF, VSTS, MSTest
XP, TDD, Scrum MSF Agile, MSF For CMMI
Evolutionary Design and Development Big Design Up Front
Ruby + IronRuby, Python + IronPyton, DLR, Silverlight(?) ?
OR\M (NHibernate, LLBLGen  etc..) DLinq, Data Access Block, DataSets, Plain ADO. NET
Open Source (Mono, SourceForge) Application Blocks, CodePlex
MVC and MVP (RoR, MonoRail..) Web Forms, CAB, Smart Client Factory
CVS, SVN VSS, VSTS Source Control
Build Automation and CI
(CI Factory, NAnt, FinalBuilder, CruiseControl..)
Team Build
TDD and Unit Testing
NUnit, MbUnit, RhinoMocks, NMock, TypeMock
MSTest for unit testing, VSTS
Subtext, DasBlog, WordPress, TypePad, Blogger, FeedBurner Microsoft MSN Spaces, Community Server(?)
Simplicity in Design P&P
Working at Google Working at MS
Google Gears Smart Client, MS Ajax
.NET 3.X (WF, WPF. Silverlight) .NET 2.0
DI, IoC, Spring for .NET Object Builder
Conferences:
OSCon, RubyCon, Code Camps, DevTeach..
VSLive, TechEd, DevConnections..

Считаю, что необходимо как минимум ознакомиться со всеми перечисленными понятиями как в правой, так и в левой колонках, следуя принципу анализ-синтез-best practices.

Материалы по теме

 

  1. Табличка любезно позаимствована здесь http://weblogs.asp.net/rosherove/archive/2007/06/04/alt-net-alternative-tools-and-approaches-to-mainstream-net.aspx
  2. Страница сообщества ALT.NET http://altdotnet.org/
  3. Статья в журнале MSDN “Что такое ALT .NET?” by Джереми Д. Миллер (Jeremy D. Miller) http://msdn.microsoft.com/ru-ru/magazine/cc337902.aspx
  4. Активно развивающаяся группа ALT.NET на Yahoo Groups http://tech.groups.yahoo.com/group/altdotnet/