Я думаю, что застрял в параличе анализа. Пожалуйста, помогите!
У меня есть проект, который
Реализация 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, и использовать без сохранения состояния, если он доступен: в противном случае используйте обычный сеанс.
После всего этого я могу применить стратегию открытия одного сеанса / сеанса без сохранения состояния для каждой модели представления, и когда представление будет удалено, заставить модель представления сбрасывать / удалять сеанс / сеанс без сохранения состояния.
Похоже на план?