Использование шаблона проектирования Unit of Work / NHibernate Sessions в MVFM WPF - PullRequest
12 голосов
/ 09 апреля 2010

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

У меня есть проект, который

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

Теперь, согласно Орену Эйни (Айенде): http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

Он убеждает аудиторию в том, что сеансы NHibernate должны создаваться / удаляться при удалении представления, связанного с презентатором / моделью представления. Он представляет проблемы, почему вы не хотите, чтобы один сеанс для приложения Windows, а также вы не хотите, чтобы сеанс создавался / удалялся для каждой транзакции. К сожалению, это создает проблему, потому что мой пользовательский интерфейс может легко иметь более 10 представлений / моделей представления в приложении. Он использует стратегию MVP, но переводит ли его совет в MVVM?

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

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

Обновление:

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

  • Откажитесь от моей реализации единицы работы
  • Перейдите к использованию объектов NHessionnate ISession и IStatelessSession непосредственно из viewmodel. Хотя, на мой взгляд, это не идеально, я уже потратил слишком много времени на работу, и она не соответствует тому, что есть. Нужно применить KISS и YAGNI в какой-то момент. Я могу, по крайней мере, утешиться тем фактом, что статья Айенде и некоторые другие указывают на то, что использовать их напрямую можно.
  • Если я действительно не хочу показывать ISession, я всегда могу использовать Castle.ActiveRecord, но я думаю, что в этом нет необходимости.
  • Я могу повторно использовать код фабрики сеансов, поэтому реализация единицы работы не является полной тратой.
  • Рефакторинг моих репозиториев, чтобы разрешить внедрение StatelessSession и Session, и использовать без сохранения состояния, если он доступен: в противном случае используйте обычный сеанс.

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

Похоже на план?

Ответы [ 4 ]

3 голосов
/ 15 мая 2012

Я знаю, что это было довольно давно, но я искал в интернете достойный ответ в течение 3 дней. Я прочитал два блога, о которых вы упомянули, и взглянул на кулинарную книгу Nhibernate 3.0, где они также рассказывают о Nhibernate в приложении MVP, но это не совсем вписывается в мой контекст MVVM с репозиториями и использованием Ninject для IoC.

Я нашел этот старый пост, который до сих пор был самой полезной страницей: http://www.emidee.net/index.php/2010/08/23/ninject-use-one-database-session-per-view-model

Надеюсь, это поможет любому, кто наткнется на этот вопрос в будущем.

2 голосов
/ 09 апреля 2010

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

1 голос
/ 09 апреля 2010

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

0 голосов
/ 14 июля 2010

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

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

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

...