Используя шаблон разработки Единицы работы / NHibernate Sessions в MVVM WPF

Я думаю, что застреваю при параличе анализа. Помогите!

У меня в настоящее время есть проект это

Реализация единицы работы в моем случае поддерживает одну сессию NHibernate за один раз. Я думал в то время, когда это имеет смысл; это скрывает внутренние работы сессии NHibernate от ViewModel.

Теперь, по словам Oren Eini (Ayende): http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

Он убеждает аудиторию, что сессии NHibernate должны быть созданы / расположенный, когда представление, связанное с предъявителем / viewmodel, расположено. Он представляет проблемы, почему Вы не хотите одну сессию на приложение Windows, и при этом Вы не хотите, чтобы сессия была создана / расположенный на транзакцию. Это, к сожалению, создает проблему, потому что мой UI может легко иметь 10 + view/viewmodels существующий в приложении. Он представляет использование стратегии MVP, но его совет переводит в MVVM?

Это означает, что я должен фрагментировать единицу работы и иметь viewmodel, создают сессии NHibernate непосредственно? Приложение WPF должно только иметь одну рабочую сессию за один раз? Если это верно, когда я должен создать / располагают сессию NHibernate?

И я все еще не рассмотрел, как сессии Не сохраняющие состояние NHibernate вписываются во все это! Мой мозг собирается взорваться. Помогите!

Обновление:

Я нашел реализацию Единицы работы Ayende в Инструментах Носорога. Я обнаружил, что существуют существенные различия между его реализацией и той, которую я сделал. Его определенно поддерживаемый несколько сессий. После дальнейшего исследования я думаю, что лучше, чтобы я сделал следующее:

  • Фрагментируйте мою реализацию Единицы работы
  • Уйдите в отставку к использованию ISession NHIBERNATE, и IStatelessSession возражает непосредственно от viewmodel. В то время как, по-моему, это не идеально, я уже провел слишком много времени на Единице работы, и это не развивается к тому, каково это. Должен применить KISS и YAGNI в какой-то момент. Я могу, по крайней мере, взять утешение в том, что статья Ayende и немногие другие указывают, что использование их непосредственно в порядке.
  • Если я действительно действительно не хочу выставлять ISession, я могу всегда использовать Замок. ActiveRecord, но я думаю, что это не необходимо.
  • Я могу снова использовать код Фабрики Сессии, таким образом, реализация Единицы работы не является всеми отходами.
  • Пересмотренный мои репозитории для разрешения инжекции и StatelessSession и Сессии и использования, не сохраняющего состояние, если это доступно: иначе используйте очередную сессию.

В конце концов, это, затем я могу применить стратегию открытия одной сессии / сессия не сохраняющая состояние на viewmodel и когда представление расположено, имейте сброс viewmodel / располагают сессию / сессия не сохраняющая состояние.

Походит на план?

12
задан user919426 7 August 2016 в 00:35
поделиться

3 ответа

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

1
ответ дан 2 December 2019 в 23:19
поделиться

Что вас беспокоит в наличии 10+ активных сессий? Сессии - это легковесные объекты, которые могут использоваться для тяжелых операций. Если сессия в данный момент ничего не делает, она вроде как несущественна.

2
ответ дан 2 December 2019 в 23:19
поделиться

Лично я стараюсь держать сессии открытыми как можно меньше времени. Основная причина в том, что мы используем пессимистическую блокировку на нашем главном корне агрегата (мы используем domain driven design), поэтому мы хотим освободить блокировку как можно быстрее. Не забывайте, что поскольку вы используете NHibernate на стороне клиента, вы можете закрыть свою сессию и, открыв новую, снова соединить отсоединенные сущности.

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

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

0
ответ дан 2 December 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: