ASP.Net MVC, ORM и «тяжелые» объекты - PullRequest
3 голосов
/ 01 сентября 2009

Я думаю, что эта проблема распространена в веб-приложениях с моделью среднего размера. Допустим, у меня есть класс SportCenter, содержащий список BasketballField, когда показывает бронирование или свойства BasketballField, которые я все еще хочу показать Немного информации о Спортивном Центре, которому он принадлежит.

Я использую ASP.Net MVC и nHibernate для слоя данных, поэтому мой вопрос: стоит ли делать загрузку nHibernate целым экземпляром SportCenter (на самом деле содержащиеся коллекции загружаются лениво, но класс "тяжелый") вместе с моим BasketballField и его информацией, чтобы показать только несколько полей Sportcenter

С другой стороны, построение очень хорошо настроенных запросов в HQL возвращает меня к старому Классические дни ASP с выполненными вручную SQL-запросами ...

Какую лучшую практику предложить?

Спасибо вам всем, Питер.

Ответы [ 5 ]

2 голосов
/ 01 сентября 2009

Попробуйте, запустите, профилируйте. Попробуйте оба способа и используйте профиль, такой как ANTS Profiler Red Gate , чтобы увидеть, есть ли заметная разница в производительности.

Если разницы не так много, используйте ту, которая более читабельна - с помощью класса SportCenter - в противном случае используйте HQL.

ИМХО, OR / Ms в их текущем состоянии не являются полной заменой SQL / вариантов.

0 голосов
/ 02 сентября 2009

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

0 голосов
/ 02 сентября 2009

Рассмотрим Linq. NHibernate поддерживает Linq. С Linq легко писать безопасные типы запросов, которые возвращают «частичные объекты» или любые поля, которые вы действительно хотите.

Два других предложенных вами варианта, вероятно, "достаточно хороши" и должны работать.

Как сказал человек-b, используйте профилировщик, если вас интересует производительность.

Просмотр конкретных DTO - это лучшая практика, и, вероятно, здесь есть смысл.

0 голосов
/ 01 сентября 2009

Я твердо верю в разделение команд / запросов (версия Грега Янга), поэтому я бы сказал, что если вы хотите отобразить данные для пользователя (запрос), вам определенно не следует использовать модель вашего домена. Геттеры часто являются анти паттерном, когда дело доходит до хорошего домена.

В настоящее время я предпочитаю использовать специальные экранные DTO, заполненные NHibernate. Они работают лучше всего, когда их вытесняют из отдельной таблицы, но вы можете использовать NHibernates AliasToBeanTransformer для заполнения таблицы вашего домена.

0 голосов
/ 01 сентября 2009

Если вы запрашиваете его со стороны BasketballField, то каждый BasketballField может либо «получить присоединение» к SportCentre, либо отключить отложенную загрузку с конца BasketballField (поскольку у каждого BasketballField будет только один SportCentre).

Основные накладные расходы, с которыми я столкнулся, связаны с тем, что nHibernate перегружает базу данных множеством небольших ленивых загрузок, и обычно решение состоит в том, чтобы вернуть все данные за один прием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...