Причины перехода с LLBLGen Pro на NHibernate

Мой коллега уже описал пару причин, почему мы постепенно отказываемся от LLBLGen Pro в пользу NHibernate. Хочу добавить свои 50 центов.

Мы разрабатываем все проекты по методологии XP, активно используем принципы KISS и YAGNI, поэтому каждый проект, его доменная модель и, соответственно, база данных постоянно развиваются. С LLBLGen Pro нам приходилось генерировать модель несколько раз в день и, если одновременно нескольким разработчикам необходимо было что-то изменить – выстраивалась живая очередь.

С генерируемым кодом очень сложно использовать TDD – практически невозможно писать тест до кода. Чтобы написать тест необходимо проделать следующие шаги: добавить таблицу/поле/ограничение в базу; сгенерировать модель и только затем написать тест – это уже не TDD.

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

Сгенерированный код очень трудно рефакторить: нельзя просто переименовать сущность/поле/связь – необходимо сначала произвести переименование в проекте, потом в генераторе и затем заново сгенерировать модель.

NHibernate, же, позволяет переименовывать сущности как вам угодно прямо в Visual Studio (при условии, что для конфигурирования отображения используется fluent-nh) – необходимо будет только удостовериться, что рефакторинг произошел безболезненно – запустить тесты (а у вас ведь они есть ;-)).

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

Нет поддержки Value Object – т.е. невозможно из одной сущности выделить небольшие однообразные объекты, невозможно использовать связанную таблицу как Value Object.

Для отображения связи сущностей m:n используются также вспомогательные сущности, при этом сами коллекции m:n всегда прибывают в состоянии «только чтение»: чтобы добавить или удалить связанную сущность необходимо работать с коллекциями вспомогательных сущностей.

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

NHibernate лишен всех этих недостатков.

Вместо заключения


Ваш выбор LLBLGen если:
  • вам нужен очень быстрый старт и проект в дальнейшем не планирует своего развития либо поддержки;
  • вы разрабатываете проект с использованием тяжеловесных методик типа RUP и всяких там MSF, где вся система заранее детально проработана.
Ваш выбор NHibernate если:
  • ваша система находится в непрерывном развитии и вам необходима большая гибкость на уровне ORM
PS: всех с Новым годом ;-)
comments powered by Disqus