Я думаю, что застреваю при параличе анализа. Помогите!
У меня в настоящее время есть проект это
Реализация единицы работы в моем случае поддерживает одну сессию 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 в Инструментах Носорога. Я обнаружил, что существуют существенные различия между его реализацией и той, которую я сделал. Его определенно поддерживаемый несколько сессий. После дальнейшего исследования я думаю, что лучше, чтобы я сделал следующее:
В конце концов, это, затем я могу применить стратегию открытия одной сессии / сессия не сохраняющая состояние на viewmodel и когда представление расположено, имейте сброс viewmodel / располагают сессию / сессия не сохраняющая состояние.
Походит на план?
Использование UnitOfWork серьезно ограничивает клиентское приложение , как и вся ленивая загрузка. Вы теряете часть того, в чем хорош NHibernate. Вы также настраиваете себя для исключений времени выполнения, потому что в модели NHibernate нет ничего, что напоминало бы вам не использовать эти функции. Я бы сказал, что совет Айендеса - это хорошо.
Что вас беспокоит в наличии 10+ активных сессий? Сессии - это легковесные объекты, которые могут использоваться для тяжелых операций. Если сессия в данный момент ничего не делает, она вроде как несущественна.
Лично я стараюсь держать сессии открытыми как можно меньше времени. Основная причина в том, что мы используем пессимистическую блокировку на нашем главном корне агрегата (мы используем domain driven design), поэтому мы хотим освободить блокировку как можно быстрее. Не забывайте, что поскольку вы используете NHibernate на стороне клиента, вы можете закрыть свою сессию и, открыв новую, снова соединить отсоединенные сущности.
Лично я даже в приложении, где одновременно открыто много окон/вкладок, все равно использовал бы только один сеанс за раз. Я бы открывал новую сессию, когда мне нужно получить данные для представления или когда изменения должны быть сохранены.
В какой-то момент в нашем текущем приложении мы реализовали поддержку нескольких сессий в Unit Of Work, но в итоге убрали ее, когда поняли, что она нам не нужна и только усложняет работу.