Monday, April 20, 2009

NHibernate – где узнать больше?

Я вот довольно много пишу про Entity Framework и LINQ to SQL, но мало про другие ORM, особенно про NHibernate. Исправляюсь.

Ни для кого ни секрет, что несмотря на то, что NHibernate – это очень мощный ORM, он достаточно сложен в освоении. Как модно сейчас говорить, у него слишком крутая кривая обучения (learning curve), на которую многим тяжело забраться, особенно в условиях сжатых сроков и рисков. И несмотря на то, что у наших друзей из java-community O/R Mappers в целом, и Hibernate в частности пользуются популярностью уже давно, бОльшая часть .NET-программистов не пользовались этим продуктом, а многие даже и не знали о нем до выхода аналогов от Microsoft: LINQ to SQL и Entity Framework. К сожалению, .NET-сообщество программистов слишком часто не обращает внимания на то, что исходит не от Microsoft, или не доверяет этому, поэтому до недавнего времени NHibernate был интересен лишь очень небольшому проценту посвященных.

К слову, во многом это именно наша локальная проблема. В других странах существует так называемое ALT.NET-сообщество (в основном, опенсорсной направленности), которые проводят свои конференции и встречи, обсуждая на них альтернативные инструменты и подходы к разработке приложений, отличающиеся от инструментов и подходов Microsoft, тем самым рекламируя их и продвигая. Многие из лидеров этого сообщества выступают с критикой продуктов от Microsoft, являясь по своей сути оппозицией в терминах, понятных нашей стране :) К слову сказать, благодаря этой “оппозиции” мы имеем достаточно серьезное движение Microsoft навстречу сообществу, более серьезное внимание к нуждам программистов, открытые исходные коды и целые проекты, идущие по open-source лицензиям.

Но это, скорее всего, вы и так уже знали… А заметка эта на самом деле о том, где узнать больше о NHibernate. К сожалению, на данный момент существует лишь одна книжка по NHibernate: NHibernate in Action, которая до нашей страны дойдет, уверен, не скоро. Однако, есть довольно много альтернативных источников информации, которые, надеюсь, будут вам полезны:

http://www.nhibernate.org/ – официальный сайт, где есть полная документация

http://nhforge.org/ – ресурс, посвященный NHibernate, на котором есть Getting Started Guide, блоги, wiki, и еще много чего полезного

http://blogs.hibernatingrhinos.com/nhibernate/Default.aspx – NHibernate FAQ, фактически блог, который ведут разные авторы, много полезной информации

http://ayende.com/Blog/category/510.aspx – категория NHibernate в блоге Oren Eine, одного из контрибьюторов (разработчиков) NHibernate, который в последнее время постит очень много информации по маппингу – на мой взгляд, самой высокой ступеньке в кривой обучения NHibernate

http://summerofnhibernate.com/ – видео обучалки (скринкасты) по NHibernate, для тех, у кого восприятие визуальной информации происходит лучше, чем восприятие текстовой, или кому просто нужно быстро разобраться на простых примерах

http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx – NHibernate best practices при разработке ASP.NET приложений

http://www.codeproject.com/KB/database/Nhibernate_Made_Simple.aspx – еще одна интересная статья с CodeProject.com, вкратце обо всем

http://www.theserverside.net/tt/articles/showarticle.tss?id=NHibernate – аналогично предыдущей, только с другого ресурса

Также я вам советую посмотреть следующие полезности, разработанные для NHibernate:

http://sourceforge.net/projects/nhcontrib – NH Contrib, много полезных компонентов

http://code.google.com/p/sharp-architecture/ - Sharp Architecture – фреймворк для разработки веб-приложений с использованием ASP.NET MVC и NHibernate, рекомендуется для тех, кому нужны шаблоны использования NH с MVC, и кто хочет использовать готовый каркас приложения

http://nhplugin.lieser-online.de/ – поддержка NH в ReSharper, здесь добавить просто нечего

И, напоследок, еще парочка постов, похожих на мой, в которых вы найдете эти и другие полезные ссылки:

http://www.theserverside.net/news/thread.tss?thread_id=46642

http://www.thefreakparade.com/2008/07/so-you-want-to-learn-nhibernate-part-1-of-1-the-links/

Удачи в изучении NH.

Sunday, April 12, 2009

Список интересных подкастов: выпуск #1

Недавно прослушал несколько интересных подкастов. Хотел бы поделиться некоторыми наиболее интересными на мой взгляд:

Carl, Richard и Ward Bell обсуждают вопросы использования ORM в целом и Entity Framework в частности. Послушав этот подкаст, вы узнаете какие проблемы есть у Entity Framework v1.0 (дизайнер, POCO, etc.), еще раз про ситуацию с LINQ to SQL и Entity Framework, о которой я уже писал, почему NHibernate, несмотря на свои функциональные преимущества, не очень популярен в широких кругах программистов, когда стоит использовать ORM, когда не стоит, а также какие есть проблемы разработки RIA приложений, в частности проблема единственности модели данных, когда и на сервере, и на клиенте приходится делать одинаковую модель, чем тут может быть полезен DevForce .NET Silverlight-разработчикам (хотя после выхода RIA Services часть проблемы с моделью вроде бы как уходит).

Гость программы, Doug Crockford рассказывает про свой профессиональный опыт, а также про создание формата данных JSON, автором которого он является (!). Также довольно много обсуждений того, почему DOM - ахиллесова пята клиентских скриптов, различных стандартов, на которых строится JavaScript, а также его будущего. Весьма познавательно.

Robert C. Martin (Uncle Bob) в гостях у Скотта рассказывает последнему, что такое Single Responsibility Principle, Open Closed Principle, Liskov Substitution Principle, Interface Segregation и Dependency Inversion Principle (SOLID). Очень детально и на примерах. Рекомендую всем, кто начинает понимать, что кроме внешнего качества продукта, есть еще его внутреннее качество - качество кода.

Просто отличный подкаст о людях, которые разрабатывают софт не только для крупных организаций, и не только за деньги. Приложение, которое вносит свою лепту в дело борьбы с раком, разработанное в Scripps Institute, в котором поучаствовало много программистов со всего мира, объединенных одной целью. WPF, Sharepoint, Scrum, и многое другое. Если вы хотите изменить мир к лучшему, то послушайте как это делают другие люди: возможно, у вас появится руководство к действию.

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

А какие подкасты нравятся вам?

Saturday, April 4, 2009

ASP.NET MVC: такие разные модели

Как известно, ASP.NET MVC основан на паттерне Model-View-Controller. Первым компонентом этого паттерна является модель, которую я бы и хотел рассмотреть сегодня поподробнее.

Модель - это самый абстрактный компонент шаблона MVC. Моделью может быть все, что угодно, что не является контроллером и представлением :) На самом деле, модель - это то, что мы привыкли называть данными, и бизнес-логика, которая работает с этими данными, состояниями приложения и т.д. То есть, в терминах 3-звенной архитектуры, моделью можно назвать вашу бизнес-логику и все то, что лежит ниже ее, то есть слой доступа к данным и сами эти данные. А в терминах DDD моделью, наверно, можно назвать слой ваших сервисов и все, что под ним: репозитории, инфраструктуру и т.д. Причем данные эти могут находится абсолютно где угодно, а не только в базе данных: где-то на веб-сервисах, в файловой системе, распределенном кеше или даже в конфигурационном файле.

В ASP.NET MVC же модель - это несколько более широкое понятие, так как различных моделей в ASP.NET MVC не одна, а целых две. То, что мы рассмотрели выше, называется моделью предметной области, или доменной моделью (Domain Model). Однако есть еще одна модель - т.н. модель представления (View Model). Что же это такое?

View Model - это реализация одноименного подхода (или паттерна) к передаче данных в представление, который используется не только в ASP.NET MVC, но и в других местах, например, в Silverlight или WPF. View Model отличается от Domain Model тем, что он предназначен не для представления предметной области, а лишь для передачи данных из контроллера в представление в удобной форме. Ведь не всегда вашему представлению нужны все данные сущности, а иногда, наоборот, нужны данные в каком-нибудь специфическом аггрегированном формате, или просто набор этих данных, не связанный между собой ничем, кроме того факта, что он будет отображен на одной и той же странице. То есть, по сути, View Model - это некая проекция данных Domain Model, которая необходима конкретному представлению.

Например, у нас есть страница, которая показывает категории продуктов слева в меню, и список продуктов конкретной категории в области контента. Для отрисовки этой страницы (представления) ей необходимо получить от контроллера список категорий, выбранную категорию и список продуктов этой категории. Самый простой способ - передать эти данные через dictionary ViewData. Но это как-то не по-ковбойски :) Никакой безопасности типов + возможность ошибиться в строке ключа. Тогда остается лишь передавать данные через типизацию класса ViewPage<Type>, где Type - это тип передаваемого объекта, который будет доступен через свойство Model в представлении. Однако, у нас в Domain Model нет такого типа, который бы содержал две необходимые нам коллекции и одну сущность. Поэтому нужно его создать и назвать, например, ProductsListViewModel. Данный тип будет вспомогательным, его единственное назначение - это послужить контейнером для передачи данных из контроллера в представление.

Что это нам дает? Во-первых, теперь мы можем обращаться к переданной таким образом коллекции категорий следующим образом:

<%= Model.Categories %>

Во-вторых, если мы когда-то решим, что нам бы не помешало создать Partial View (ascx-контрол, по-русски) для показа списка категорий, нам будет достаточно подключить его на страницу при помощи следующего вызова:

<% Html.RenderPartial("CategoriesList", Model.Categories); %>

И даже если мы когда-нибудь захотим еще и подсвечивать выбранную категорию, то мы легко можем создать CategoriesListViewModel, который будет содержать коллекцию категории и ссылку на выбранную категорию, а потом использовать эту новую модель в ProductsListViewModel. При этом наш контрол будет наследоваться от ViewUserControl<CategoriesListViewModel>. Красота, все разложено по полочкам, предельно просто и понятно.

Пара слов о том, где хранить созданные классы View Model. Как вы уже поняли, их может быть довольно много, в зависимости от количества представлений и их сложности. Я предложил бы хранить их в замечательной папочке Models, которую Visual Studio вам заботливо генерирует при создании проекта ASP.NET MVC. Классы Domain Model вы там все равно, скорее всего, хранить не будете (по крайней мере, я бы советовал для них создавать отдельную сборку). А если даже и будете, то никто не мешате создать две папки Model/DomainModel и Model/ViewModel.

Самые внимательные уже наверно увидели сходство паттерна View Model с DTO (Data Transfer Object). И сходство действительно есть, причем значительное. И там, и там - проекции данных для передачи куда-то. Только, в отличие от DTO, которые могут передаваться как угодно далеко, хоть на деревню дедушке, View Model объекты передаются всего лишь по соседству в представление. Так что можете пользоваться этой аналогией, если вам так будет проще понять смысл View Model и его назначение.

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

Model:

Stephen Walther: Understanding Models

View Model:

DataModel and ViewModel
DataModel-View-ViewModel pattern series