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

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

15 ответов

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

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

Я написал пост о том, как использовать шаблон Repository с 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, если ваш проект работает с представлением ActiveRecord, что база данных является вашей моделью. Вы получите один класс на стол, и все просто волшебным образом работает. Вы можете, конечно, настроить и переопределить вещи, но если вы (или ваш проект) принципиально не согласны с подходом "класс на таблицу", я бы посмотрел на NHibernate, поскольку он начинается с более сложного (но более гибкого) подхода отображения вашего модель домена в вашей базе данных.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рассматривайте свою команду и размер проекта при рассмотрении ActiveRecord.

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

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

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

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

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

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

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

Проверь это

:)

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

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

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

Другие вопросы по тегам