Я думаю, что застрял в параличе анализа. Пожалуйста, помогите!
В настоящее время у меня есть проект, который
- Использование NHibernate на SQLite
- Реализует шаблон репозитория и единицы работы: http://www.nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx
- Стратегия 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.
Звучит как план?