Что такое консенсус, когда использовать один из этих инструментов по сравнению с другим? Я считаю, что Subsonic очень полезен с точки зрения быстрого выполнения задач, но в больших проектах он не масштабируется и связывает вашу модель домена с моделью вашей базы данных. Вот где Nhibernate предлагает легкие POCO, которые не связаны с вашей моделью базы данных, но время установки намного больше.
Мне часто задают этот вопрос, и на самом деле все сводится к тому, сколько ты хочешь возиться. Я не могу сказать вам, насколько разрушительными были комментарии Криса Киваса 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 , предоставленный инструмент, вы можете легко сопоставить вашу базу данных с объектами домена.
Вы можете посмотреть на беглый NHibernate; это делает управление NHibernate легким. Не уверен, насколько сложно будет выполнить переход существующей схемы, но если вы создаете новое приложение, было бы неплохо определить модель домена и сгенерировать базу данных практически на любом сервере БД, о котором вы только могли подумать. Прочитав другие комментарии здесь, я думаю, что Fluent NHibernate переводит NHibernate на один уровень с SubSonic для простоты настройки.
Я не могу дать хорошее сравнение, поскольку я еще не использовал NHibernate в проекте, но я использовал SubSonic и был очень доволен этим. Пока что я не столкнулся с какими-либо серьезными препятствиями при его использовании.
Проверьте этот пост от Rob Конери, один из создателей SubSonic. Он рассказывает о том, как отделить ваш код SubSonic от остальной части приложения. Он даже упоминает тот факт, что эта архитектура позволит вам впоследствии заменить SubSonic на какой-то другой уровень доступа к данным, такой как NHibernate или LINQ to SQL.
Я знаю, что на самом деле не ответил на ваш вопрос, но я надеюсь, что это все еще помогает.
Недавно я написал сообщение в блоге о .NET ORM, в которых есть Subsonic и ActiveRecord. Исходя из моего опыта, это зависит от того, что делает проект. Subsonic работает намного лучше, если вы работаете с SQL, но NHibernate имеет больше возможностей. ActiveRecord хорош для небольших проектов, я не уверен, что он быстрее для больших проектов, чем придерживаться NHibernate.
Я оценил оба, и я считаю, что было бы несправедливо рекомендовать одно другому без понимания ваших целей. В своем вопросе вы хорошо изложили различия, и я считаю, что это должно быть вашим решающим фактором. Лично я использовал оба и буду использовать оба в зависимости от проекта.
- NHibernate - мой выбор для более масштабных проектов, потому что он использует легкие POCO. Если бы я когда-нибудь сменил свой ORM на «я верю», это было бы намного проще для рефакторинга.
- SubSonic - мой выбор, когда у меня небольшой проект. Я считаю, что SubSonic с точки зрения производительности хорошо масштабируется. Тем не менее, я чувствую себя тесно связанным с этим, потому что это так выгравировано в моем проекте. В меньшем проекте я все еще могу отключить его, потому что кодовая база очень мала, и это действительно помогает мне вырвать код, как рекламируется.
Опять же, немного не по теме, но я буду вторым Castle ActiveRecord - вместо того, чтобы использовать базу данных в качестве модели (подход Subsonic) или проводить часы в спагетти XML (подход NHibernate), вы просто размещаете атрибуты в классах модели.
Вы даже можете заставить ActiveRecord сгенерировать схему базы данных для вас.
Мы использовали этот подход в довольно многих проектах сейчас, и преимущества заключаются в следующем:
- Простой путь обновления до NHibernate, если потребуется в будущем
- Поддержка простых моделей наследования - например. Автомобиль -> Автомобиль
- Сгенерированная им схема, скорее всего, такова, как вы бы ее создали, так что вы можете потратить больше времени на создание приложения, не беспокоясь о синхронизации вашей модели / базы данных.
Я думаю, что вы в значительной степени прибили это. Subsonic генерирует код, поэтому ваши бизнес-объекты будут отражать структуру вашей базы данных. nHibernate использует файлы сопоставления, которые отображают ваши бизнес-объекты в базу данных, так что ваши объекты могут быть структурированы так, как вам нравится.
Насколько велик проект? Будет ли необходима долгосрочная поддержка? Собирается ли экономическая эффективность Subsonic компенсировать возможные проблемы масштабирования?
Мы загрузились с дозвуковой и теперь пытаемся оценить, собираемся ли мы перейти на nhibernate сейчас, когда мы находимся в болевых точках дозвуковой.
Другой наш вариант - создать некоторую золотую середину, где мы используем subsonic для запроса и загрузки произвольных объектов с их функциональностью «выполнять как типизированный список», которая выполняет сопоставление на основе имени произвольного оператора sql в стиле linq. Или попытаться воссоздать некоторые из них в nhibernate и рефакторинг остальных.
Итак, я говорю, что subsonic имеет смысл в небольших приложениях, но обслуживание дозвуковых приложений становится довольно проблематичным, у нас особенно тяжелые времена с перекрывающимся кодом проверки и предварительным / последующим в событиях, запускаемых кодом. Для шаблона активной записи subsonic определенно на 80%, но что-то делает ненадежно и мешает вам реально контролировать иерархию наследования, поскольку каждый класс должен наследовать таблицу, чтобы вернуться к этой таблице.
Рассматривайте свою команду и размер проекта при рассмотрении ActiveRecord.
По моему опыту, ActiveRecord - это абстракция поверх NHibernate, которая начинает просачиваться, как решето, при испытании более сложных сценариев.
Если у вас средняя или очень сложная или не простая схема, придерживайтесь NHibernate. Вы можете нарезать и нарезать кубиками почти до совершенства.
Другое место, где вы можете столкнуться с проблемами, - это когда вам нужен умеренно сложный запрос. ActiveRecord скрывает большую часть реализации NHibernate ... но она понадобится вам для сложного запроса, который станет очень сложным, если вы совершенно не знакомы с HQL. Будьте осторожны, члены команды не просто лезут на грани, а не изучают NHibernate и HQL.
Примите несоответствие импеданса!
:)
Или нет. Если вы хотите производительности, сделайте это сами. Если вы хотите быстро и легко, используйте NHibernate и ActiveRecord. Если вам нравится делать вид, что вы на самом деле знаете, что происходит на уровне доступа к данным, используйте NHibernate и целый день сидите с XML, чтобы заставить многих к многим идти ... Или просто ... ошибаться ... сделать это самостоятельно - ADO.Net FTW!
Я считаю, что вы должны придерживаться того, который вы можете использовать лучше всего. Конечная цель - производительность и качественный код. Если вы знаете SubSonic, то придерживайтесь его, а если вы знаете NHibernate, придерживайтесь NHibernate. Это очень субъективный вопрос. Вы также должны учитывать тот факт, что ваш член команды имеет опыт. Если вы хороши в этом, вы сможете легко поддерживать его.
Я видел большие проекты, использующие SubSonic, тогда как NHibernate уже известен и широко используется.
Решение о выборе ORM зависит не только от самой ORM.
Совет, который я получил по этой теме, заключается в том, что Subsonic не масштабируется для обработки более сложных сценариев, и поэтому, если вы пойдете по этому пути, вы получите работу, пытающуюся перейти на более продвинутый ORM.
Таким образом, меня больше интересует использование NHibernate для сложных случаев, Castle Active Record для более простых случаев, и я слежу за Fluent NHibernate, который должен значительно упростить отображение NHibernate (особенно после улучшения поддержки отображения на основе соглашения).