Nhibernate / MVC: работа с загруженными коллекциями в приложении View - PullRequest
5 голосов
/ 05 августа 2010

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

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

На мой взгляд, у меня есть следующие варианты:

  1. Измените мою стратегию управления ISession и Оставьте сеанс открытым в представлении
  2. Лучше использовать ViewModels (в настоящее время я не использую их везде).
  3. Стремление загрузить все коллекции , которые вызывают проблемы (возможно, разбиты на страницы) (свободная проблема не выдерживает)

1 кажется немного неправильным, но может быть «самым простым» решением. Возможно, 2 - правильный путь, но в некоторых случаях ViewModels кажутся немного избыточными, и я не хочу вводить больше классов, чтобы справиться с этой проблемой. 3 кажется немного грязным исправлением.

Что вы думаете?

Ответы [ 3 ]

3 голосов
/ 05 августа 2010

Лучший способ справиться с этим (на мой взгляд, в любом случае) - ввести уровень обслуживания между вашим пользовательским интерфейсом и вашими репозиториями; Он должен позаботиться о загрузке всего необходимого для представления и передать сглаженный (и полностью заполненный) dto в представление.

Часто я делаю еще один шаг и отображаю dtos, возвращаемые из сервисного уровня, для просмотра моделей, которые часто должны содержать данные, которые очень специфичны для вида и не подходят для включения в dtos, поступающие из вашего сервисного уровня. Помните, Automapper ваш друг, когда дело доходит до таких ситуаций.

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

1 голос
/ 05 августа 2010

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

Теперь

  1. продление жизни ISession, включая View, это не так, если вы не выполняете явные вызовы базы данных ...
  2. я бы не знал об этом
  3. Это на самом деле правильный путь, независимо от EOL сеанса: вы должны стараться выполнять как можно меньше запросов на запрос, а nhibernate предоставляет вам эту возможность с помощью ленивой загрузки, фьючерсов, multihql / критериев и т. Д.

примечание: несмотря на то, что вы, возможно, отобразили коллекцию как не загруженную с отложенной загрузкой, это также имеет значение Как вы запрашиваете и получаете желаемый набор результатов. Например, если вы используете HQL, используйте fetch join

0 голосов
/ 05 августа 2010

Я не думаю, что в первом подходе что-то не так, и его будет проще всего реализовать.

Сеанс на запрос - это хорошо известный шаблон управления сеансом для NHibernate.

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