Дозвуковой против NHibernate

Каково консенсусное мнение о том, когда использовать один из этих инструментов по сравнению с другим? Я считаю, что Subsonic очень полезен с точки зрения быстрого выполнения задач, но в крупных проектах он не масштабируется и связывает модель предметной области с моделью базы данных. Здесь на помощь приходит Nhibernate, поскольку он дает вам легкие POCO, которые не связаны с вашей моделью базы данных, но время установки намного больше.

Ответов (15)

Решение

Мне часто задают этот вопрос, и на самом деле все сводится к тому, сколько вы хотите возиться. Я не могу сказать вам, насколько разрушительными были комментарии Криса Сайваса RE SubSonic scaling - и с тех пор я отвечаю на них :(.

Дело в том, что с точки зрения производительности SubSonic очень хорошо масштабируется. С точки зрения роста проекта - ЛЮБОЙ инструмент, который вы используете, потребует вашего внимания. Даже NHibernate.

Я написал сообщение о том, как использовать шаблон репозитория с DI (как и с NHIb или любым другим инструментом в этом отношении) с SubSonic 2.1:

http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/

Еще я написал пост о производительности SubSOnic:

http://blog.wekeroad.com/blog/subsonic-scaling/

Надеюсь это поможет.

Я думаю, вы в значительной степени справились с этим. Subsonic генерирует код, поэтому ваши бизнес-объекты будут отражать структуру вашей базы данных. nHibernate использует файлы сопоставления, которые сопоставляют ваши бизнес-объекты с базой данных, поэтому ваши объекты могут быть структурированы так, как вам нравится.

Насколько велик этот проект? Потребуется ли долгосрочная поддержка? Сможет ли рентабельность Subsonic компенсировать любые потенциальные проблемы масштабирования?

Немного не по теме, но в том же духе. Вы смотрели на Castle ActiveRecord, он написан поверх NHibernate и устраняет необходимость тратить время на создание сопоставлений XML из кода в базу данных. Как и NHibernate, вы можете структурировать объекты своего домена по своему усмотрению, а затем сгенерировать схему базы данных из этой структуры.

Используя ActiveWriter , дополнительный инструмент, вы можете легко сопоставить свою базу данных с объектами домена.

Я бы порекомендовал SubSonic, если ваш проект работает с представлением ActiveRecord, что база данных является вашей моделью. Вы получите по одному классу за столом, и все будет волшебным образом работать. Вы, конечно, можете настраивать и переопределять вещи, но если вы (или ваш проект) принципиально не согласны с подходом класса на таблицу, я бы посмотрел на NHibernate, поскольку он начинается с более сложного (но более гибкого) подхода к отображению ваших модель предметной области в вашу базу данных.

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

Мы загрузились с дозвуковой и сейчас пытаемся оценить, собираемся ли мы переключиться на nhibernate сейчас, когда мы находимся в болевых точках дозвуковой.

Другой наш вариант - создать некую золотую середину, где мы используем дозвуковой режим для запроса и загрузки произвольных объектов с их функцией «выполнить как типизированный список», которая выполняет сопоставление на основе имени с произвольным оператором sql в стиле linq. Или попытаться воссоздать некоторые из них в nhibernate, а остальное реорганизовать.

Поэтому я говорю, что дозвуковой режим имеет смысл в небольших приложениях, но обслуживание дозвуковых приложений становится довольно непростым делом, у нас особенно тяжелые времена с перекрывающимся кодом проверки и событиями, запускаемыми до / после кода. Для активного шаблона записи дозвуковой сигнал определенно составляет 80%, но он делает что-то нестабильным и мешает вам иметь какой-либо реальный контроль над вашей иерархией наследования, поскольку каждый класс должен наследовать таблицу, чтобы вернуться к этой таблице.

Я не могу дать хорошего сравнения, поскольку я еще не использовал NHibernate в проекте, но я использовал SubSonic и был очень доволен этим. Пока я не столкнулся с какими-либо серьезными препятствиями при его использовании.

Посмотрите этот пост Роба Конери, одного из создателей SubSonic. Он рассказывает о том, как отделить ваш код SubSonic от остальной части приложения. Он даже упоминает тот факт, что эта архитектура позволит вам позже заменить SubSonic на какой-то другой уровень доступа к данным, такой как NHibernate или LINQ to SQL.

Я знаю, что на самом деле не ответил на ваш вопрос, но надеюсь, что это все еще помогает.

Снова немного не по теме, но я второй вариант Castle ActiveRecord - вместо того, чтобы использовать базу данных в качестве модели (дозвуковой подход) или тратить часы на XML-спагетти (подход NHibernate), вы просто размещаете атрибуты в своих классах модели.

Вы даже можете заставить ActiveRecord сгенерировать для вас схему базы данных .

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

  • Простой способ обновления до NHibernate, если потребуется в будущем
  • Поддержка простых моделей наследования - например. Автомобиль -> Автомобиль
  • Схема, которую он генерирует, скорее всего, соответствует тому, как вы бы ее создали в любом случае, поэтому вы можете потратить больше времени на создание приложения, а не беспокоиться о синхронизации вашей модели / базы данных.

При выборе ActiveRecord учитывайте размер вашей команды и проекта.

По моему опыту, ActiveRecord - это абстракция поверх NHibernate, которая начинает просачиваться как решето при попытке более сложных сценариев.

Если у вас умеренно или очень сложная или непростая схема, придерживайтесь NHibernate. Вы можете нарезать его почти идеально.

Еще одна проблема, с которой вы можете столкнуться, - это когда вам нужен умеренно сложный запрос. ActiveRecord скрывает большую часть реализации NHibernate ... но она вам понадобится для сложного запроса, который станет очень трудным, если вы совершенно не знакомы с HQL. Будьте осторожны, члены команды не рубят по краям вместо того, чтобы изучать NHibernate и HQL.

Недавно я написал в блоге сообщение о .NET ORM, в котором есть Subsonic и ActiveRecord. По моему опыту, это зависит от того, что делает проект, Subsonic работает намного лучше, если вы исходите из фона SQL, но NHibernate имеет больше на нем. ActiveRecord хорош для небольших проектов, я не уверен, что он быстрее для больших проектов, чем придерживаться NHibernate.

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

Таким образом, меня больше интересует использование NHibernate для сложных случаев, Castle Active Record для более простых случаев, и я слежу за Fluent NHibernate, который должен значительно упростить отображение NHibernate (особенно после улучшения поддержки сопоставления на основе соглашений).

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

  • NHibernate - мой выбор для крупномасштабных проектов, потому что он использует легкие POCO. Если бы я когда-нибудь отключил ORM «я считаю», это было бы намного проще реорганизовать.
  • SubSonic - мой выбор, когда у меня есть проект меньшего масштаба. Я считаю, что с точки зрения производительности SubSonic хорошо масштабируется. Однако я чувствую себя тесно связанным с этим, потому что это так запечатлено в моем проекте. В меньшем проекте я все еще могу выключить его, потому что кодовая база настолько мала, и это действительно помогает мне извлекать код, как рекламируется.

Примите несоответствие импеданса!

Проверь это

:)

Или не надо. Если хотите производительности, делайте это сами. Если вы хотите, чтобы это было быстро и просто, используйте NHibernate и ActiveRecord. Если вам нравится делать вид, что вы действительно знаете, что происходит на уровне доступа к данным, используйте NHibernate и сидите с XML весь день, чтобы заставить многих или многих работать ... Или просто ... эээ ... сделайте это самостоятельно - ADO.Net FTW!

Вы можете рассмотреть возможность просмотра Fluent NHibernate; это упрощает управление NHibernate. Не уверен, насколько сложно будет перенести существующую схему, но если вы создаете новое приложение, неплохо определить модель предметной области и сгенерировать базу данных практически на любом сервере БД, о котором вы только можете подумать. Читая другие комментарии здесь, я думаю, что Fluent NHibernate ставит NHibernate на один уровень с SubSonic для простоты настройки.

Как бы то ни было ... С тех пор, как я задал этот вопрос, у меня была возможность использовать обе технологии довольно часто. И я должен остаться, и если вы выберете эти технологии, это не имеет большого значения. Конечно, NHibernate позволяет вашим бизнес-объектам быть немного менее привязанными к структуре вашей базы данных, но я все же считаю, что во многих случаях вам все равно придется подчиняться воле базы данных.

На мой взгляд, единственный верный способ полностью отделить вашу модель домена от вашей модели базы данных - это написать собственный DTOS (по сути, POCO для передачи данных), а затем сопоставить их с выбранным ORM на вашем уровне данных. Но в большинстве случаев такой подход доставит мне больше хлопот, чем он того стоит.

Я считаю, что вам следует придерживаться того, что вы можете использовать наилучшим образом. Конечная цель - продуктивность и хорошее качество кода. Если вы знакомы с SubSonic, придерживайтесь его, а если вы знаете NHibernate в глубине, придерживайтесь NHibernate. Это очень субъективный вопрос. Вы также должны учитывать тот факт, что у вашего члена команды есть опыт. Если у вас это хорошо получается, вы легко сможете его поддерживать.

Я видел большие проекты, использующие SubSonic, тогда как NHibernate уже известен и широко используется.

Решение о выборе ORM зависит не только от самого ORM.