Дозвукова проти NHibernate [закрито]


77

Який консенсус щодо того, коли використовувати один із цих інструментів, який рекламується для іншого? Я вважаю Subsonic дуже корисним з точки зору швидкого виконання робіт, але у великих проектах він, як правило, не масштабується, і пов’язує вашу модель домену з моделлю бази даних. Саме тут входить Nhibernate, оскільки він дає вам легкі POCO, які не пов’язані з вашою моделлю бази даних, але час налаштування значно довший.

Відповіді:


84

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

Угода така - ідеально підходить, 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/

Сподіваюся, це допомагає.


12
Упереджений чи ні, я витратив останні 4 години, намагаючись дослідити, з чим легше підібрати та працювати, а крива навчання з SubSonic здається дуже мінімальною порівняно з NHibernate ...
RSolberg

1
В даний час я використовую дозвуковий Simple-repository для проекту, він справді простий у використанні, але, на жаль, повільний і досить глючний. після перегляду деякого коду з використанням профайлера приблизно 20% часу було витрачено на отримання значень з бази даних, а решту в самій дозвуковій. ось чому я зараз розглядаю інші рішення.
kay.one

"Повільний і досить глючний". Це все одно, що сказати, що цей коментар "дурний і досить неінформативний".

45

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

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


31

Чого це варте ... Я мав можливість використовувати обидві технології набагато більше, відколи поставив це питання. І я мушу залишитися, що, якщо ці технології ви вибираєте, має значення дуже мало. Звичайно, NHibernate дозволяє вашим суб’єктам господарювання бути дещо менш пов’язаними зі структурою вашої бази даних, але я все одно виявляю, що є багато випадків, коли вам все одно доводиться прихилятися до волі бази даних.

На мій погляд, єдиним вірним способом, щоб повністю відокремити вашу модель домену від вашої моделі бази даних, є написання власного DTOS (по суті POCO для передачі даних навколо), а потім відображення їх назад до вибраного вами ORM на рівні даних. Але в більшості випадків такий підхід спричинить для мене більше клопоту, ніж варто.


13

Трохи не в темі, але схожим чином. Ви заглядали в Castle ActiveRecord, він написаний поверх NHibernate і усуває необхідність витрачати час на створення XML-зіставлення з коду в базу даних. Як і NHibernate, ви можете структурувати об'єкти домену як завгодно, а згодом генерувати схему бази даних з цієї структури.

За допомогою ActiveWriter , внесеного інструменту, ви можете легко зіставити зі своєї бази даних об’єкти домену.


Зараз я граю з CAR на пілотному проекті. Я обираю це тому, що мені подобається ідея ActiveRecord на додаток до чогось такого добре перевіреного, як NHibernate. Якщо мені в кінцевому підсумку не сподобається CAR, я можу повернутися до чистого NHibernate. Це дає мені безпечний вихід - мені це подобається. Я спробую Subsonic через кілька місяців для порівняння.
BuddyJoe

9

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


1
Я погоджуюсь. Автоматичне перетворення вільного NHibernate в поєднанні з ScheiExport NHibernate забезпечує всі переваги SubSonic без будь-яких мінусів.
задумливо

7

Я не можу дати хорошого порівняння, оскільки я ще фактично не використовував NHibernate у проекті, але я використовував SubSonic і був дуже задоволений цим. Поки що я не зазнав жодних серйозних перешкод при його використанні.

Ознайомтесь із цим дописом від Роб Конері, одного із творців SubSonic. Він розповідає про те, як відокремити ваш код SubSonic від решти програми. Він навіть згадує той факт, що ця архітектура дозволить згодом замінити SubSonic на якийсь інший рівень доступу до даних, такий як NHibernate або LINQ на SQL.

Я знаю, що насправді не відповів на ваше запитання, але, сподіваюся, це все одно допоможе.


7

Нещодавно я писав допис у блозі про .NET ORM, в яких є Subsonic та ActiveRecord. З мого досвіду, це залежить від того, що робить проект, Subsonic працює набагато краще, якщо ви походите з SQL-середовища, але NHibernate має більше цього. ActiveRecord підходить для менших проектів, я не впевнений, що для більших проектів це швидше, ніж дотримання NHibernate.


Надане вами посилання не працює. Ви маєте на увазі це? shrinkrays.net/articles/a-look-at-dotnet-orms.aspx
kimsk

5

Я оцінив обидва, і я вважаю, що було б несправедливо рекомендувати одне над іншим, не розуміючи, які ваші цілі. У своєму питанні ви добре зазначили відмінності, і я вважаю, що це має бути вашим вирішальним фактором. Особисто я використовував і те, і інше і надалі, залежно від проекту.

  • NHibernate - це мій вибір для більш масштабних проектів, оскільки в ньому використовуються легкі POCO. Якби я коли-небудь вимкнув свою ORM "я вважаю", це було б набагато простіше рефакторингу.
  • SubSonic - це мій вибір, коли у мене проект меншого масштабу. Я вважаю, що рівень продуктивності SubSonic добре масштабується. Однак я відчуваю тісну взаємодію з нею, тому що це так вписано в мій проект. У меншому проекті я все ще можу його вимкнути, тому що база коду настільки мала, і це дійсно допомагає мені вирвати код, що рекламується.

4

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

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

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

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

3

Думаю, ти це майже прибив. Subsonic генерує код, тому ваші бізнес-об'єкти відображатимуть структуру вашої бази даних. nHibernate використовує файли зіставлення, які відображають ваші бізнес-об'єкти в базі даних, щоб ваші об'єкти могли бути структуровані як завгодно.

Наскільки це великий проект? Чи буде потрібна довгострокова підтримка? Чи економічна ефективність Subsonic компенсує будь-які потенційні проблеми масштабування?


3

Ми завантажуємось дозвуком і зараз намагаємося оцінити, чи збираємося ми переходити до нібернації тепер, коли ми знаходимось в болючих точках дозвуку.

Нашим іншим варіантом є створення середньої точки, де ми використовуємо дозвукову інформацію для запиту та завантаження довільних об’єктів з їх функціональністю «виконувати як набраний список», яка виконує відображення на основі імені довільного оператора sqq стилю linq. Або спробувати відтворити частину з них у нібібернаті, а реструктурувати решту.

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


3

Враховуючи розмір вашої команди та проекту, розглядаючи ActiveRecord.

З мого досвіду, ActiveRecord - це абстракція поверх NHibernate, яка починає просочуватися, як решето, при спробі більш складних сценаріїв.

Якщо у вас є поміркована до дуже складна або непроста схема, дотримуйтесь NHibernate. Ви можете нарізати і нарізати кубиками майже до досконалості.

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


2

Прийміть невідповідність імпедансу!

заціни

:)

Або ні. Якщо ви хочете виступу, зробіть це самостійно. Якщо ви хочете зробити це швидко і легко, використовуйте NHibernate та ActiveRecord. Якщо вам подобається робити вигляд, що ви насправді знаєте, що відбувається на рівні доступу до даних, використовуйте NHibernate і сидіть із XML цілий день, щоб змусити багатьох до багатьох ... Або просто ... помилка .. зробіть це самостійно - ADO.Net FTW!


Той самий Стівен Форте, який зараз (станом на грудень 2010 р.) Каже: "По мірі того, як сучасне покоління інструментів ORM продовжує розвиватися, вони стають все спритнішими та простішими у користуванні, що змушує більшу кількість розробників поглянути на інтеграцію ORM у свої архітектури додатків. ". Немає нічого подібного до часу, щоб привести людину до тями! :-) devproconnections.com/article/tools-and-products/…
rsenna

2

Я вважаю, що вам слід дотримуватися тієї, яку ви можете використати найкраще. Кінцевою метою є продуктивність та якісний код якості. Якщо ви знаєте SubSonic всередині і поза, тоді дотримуйтесь його, і якщо ви знаєте NHibernate поглиблено, дотримуйтесь NHibernate. Це дуже суб'єктивне питання. Ви також повинні врахувати той факт, що члени вашої команди мають досвід. Якщо ви добре це вмієте, ви зможете це легко підтримувати.

Я бачив великі проекти з використанням SubSonic, тоді як NHibernate вже відомий і широко використовується.

Рішення щодо вибору ORM залежить не тільки від самого ORM.


0

Порада, яку я отримав по цій темі, полягає в тому, що Subsonic не масштабується для обробки більш складних сценаріїв, і тому, якщо ви підете цим шляхом, у вас з’явиться робота, яка намагатиметься перейти на більш просунуту ORM.

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


1
"що Subsonic не масштабується, щоб обробляти більш складні сценарії". Проблема в цьому полягає в тому, що просто сказати, що це нічого не означає. Продовжує існувати повна відсутність достовірних доказів того, що СС не масштабується. Думаю, це доказ того, що часом достатньо просто сказати щось в Інтернеті.
CarmineSantini

Якщо у вас є докази проблем із дозвуковим масштабуванням, надайте. Я особисто не стикався з проблемами масштабованості SubSonic.
Jim Geurts,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.