Подтвердить что ты не робот

Использование шаблона проектирования подразделения /NHibernate в MVVM WPF

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

В настоящее время у меня есть проект, который

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

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

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

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

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

Update:

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

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

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

Звучит как план?

4b9b3361

Ответ 1

Я знаю эти даты с недавнего времени, но я искал онлайн для достойного ответа в течение 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

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

Ответ 3

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

Ответ 4

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

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

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