Каковы преимущества/недостатки использования NHibernate? Какие приложения должны быть (и не должны) построены с использованием NHibernate?
Преимущества и недостатки NHibernate
Ответ 1
Так как другие ppl имеют перечисленные преимущества, я просто перечислю недостатки
Недостатки
- Увеличение времени запуска из-за подготовки метаданных (не подходит для настольных приложений)
- Огромная кривая обучения без фона orm.
- Сравнительно сложная и тонкая настройка сгенерированного sql.
- Трудно получить правильное управление сеансом, если оно используется в нестандартных средах (чтение не-webapps)
- Не подходит для приложений без чистой объектной модели домена (не все приложения в мире не нуждаются в чистых объектных моделях домена).
- Вам придется перепрыгивать через обручи, если у вас плохо разработанная (устаревшая) схема db.
Ответ 2
Преимущества:
- Гибкие и очень мощные возможности отображения.
- Кэширование.
- Очень полированная реализация UnitOfWork.
- Будущий запрос (статья).
- Классы моделей - это POCO, что эффективно означает, что вы можете легко внедрить антивещество anemic domain.
- Перехватчики - вы можете сделать своеобразное аспектно-ориентированное программирование... Как очень легко реализовать прослушивание, протоколирование, авторизацию, проверку и т.д. для вашего домена.
- Lucene.NET и NHibernate хорошо интегрированы друг с другом - дает вам очень быструю и эффективную реализацию полнотекстового индексирования.
- Он очень зрелый и популярный в корпоративной среде.
- Большое сообщество.
Недостатки:
-
Уже упомянутая кривая обучения. Вы можете очень быстро начать использовать NHibernate, но для его освоения вам потребуются месяцы. Я очень рекомендую прочитать книгу Manning NHibernate.
-
Написание XML-сопоставления может быть очень утомительным, особенно для больших баз данных с сотнями и тысячами таблиц и представлений и хранимых процедур. Да, есть инструменты, которые помогут вам генерировать эти сопоставления, но вам все равно придется делать немало ручной работы. Fluent NHibernate, похоже, упрощает этот процесс, избавляясь от сопоставлений XML, поэтому Замок ActiveRecord (AR, хотя невозможно использовать для анемичного домена, поскольку вы определяете сопоставления в атрибутах ваших классов моделей).
-
Производительность может быть низкой для некоторых сценариев. Например, крупномасштабные операции. Для тех, кому, возможно, придется использовать IStatelessSession, но ее неудобный опыт, меньше всего сказать...
Ответ 3
<сильные > Преимущества:
- Открытый исходный код
- Основываясь на широко одобренных шаблонах
- NH не является генератором кода:)
Недостатки
- Поддержка Half-done LINQ
- Низкая производительность
(см. примеры производительности и тесты LINQ на ormbattle.net)
Ответ 4
Преимущества:
- Кэширование
- Простота в вашем коде
- Питание
- Гибкость
- Поддержка нескольких баз данных
Недостатки:
- Останавливает запись собственного кода сохранения
- Может снизить ваши знания SQL
Приложения, которые вы должны использовать для:
- Любые, которые используют базу данных
Ответ 5
Ответ на высокий уровень состоит в том, что NHibernate находится в классе сам по себе и не существует конкуренции.
Если вам нужна CRUD для базы данных из приложения .NET, вы должны использовать NHibernate по крайней мере по двум причинам:
1) Вы получаете поддержку Linq (что требует чего-то вроде ORM)
2) NHibernate очень зрелый
Нет существенных недостатков. Существуют и другие варианты, но эти другие варианты имеют существенные недостатки.
Я написал еще немного об этом некоторое время назад:
Ответ 6
Недостатки: NHibernate не является продуктом Microsoft и, следовательно, столкнется с некоторым сопротивлением со стороны коллег, которые не слышали об этом. Особенно FOSS фанатиков. Конфигурирование файлов сопоставления и ленивое/нетерпеливое поведение загрузки могут занять много времени. Если ваша база данных имеет странное соглашение об именах, нетипичный дизайн или очень строгие требования к производительности, может потребоваться больше работы, чем ожидалось.
Я говорю это много, но ActiveRecord - отличный слой над NHibernate. Он использует атрибуты для сопоставления точек данных с членами класса непосредственно в самих классах. Люди не используют эту вещь достаточно.