Хотелось узнать у многоуважаемого All best practice в использовании nHibernate с WinForms либо WPF приложениями, которые активно отображают/редактируют данные из БД посредством байндинга.
Где начинается и заканчивается область действия сессии nHibernate? То, что есть разные подходы и наиболее оптимальный это использование сессии в качестве UnitOfWork это понятно. Проблемы начинаются на этапе байндинга, когда не используются Not.LazyLoad(), и сессия уже закрыта, а байндинг только начинается...
Что посоветуете? Читал блоги, читал гугл, читал статьи... В основном все посвящено Web приложениям, но там все до тупости примитивно, так как область действия сессии — страница. А тут, с пользовательскими контролами и т.п. все намного интересней.
21.06.11 12:43: Перенесено модератором из '.NET' — TK
Здравствуйте, Аноним, Вы писали:
А>Хотелось узнать у многоуважаемого All best practice в использовании nHibernate с WinForms либо WPF приложениями, которые активно отображают/редактируют данные из БД посредством байндинга.
А>Где начинается и заканчивается область действия сессии nHibernate? То, что есть разные подходы и наиболее оптимальный это использование сессии в качестве UnitOfWork это понятно. Проблемы начинаются на этапе байндинга, когда не используются Not.LazyLoad(), и сессия уже закрыта, а байндинг только начинается...
А>Что посоветуете? Читал блоги, читал гугл, читал статьи... В основном все посвящено Web приложениям, но там все до тупости примитивно, так как область действия сессии — страница. А тут, с пользовательскими контролами и т.п. все намного интересней.
UI надо привязывать к ViewModel, на которую отображаются загруженные через ORM объекты доменной модели. А вообще есть неплохая статья
здесь.
Здравствуйте, Аноним, Вы писали:
А>Хотелось узнать у многоуважаемого All best practice в использовании nHibernate с WinForms либо WPF приложениями, которые активно отображают/редактируют данные из БД посредством байндинга.
Поищите по фразе
session per business transaction. Такой подход
рекомендует разработчик NHibernate Fabio Maulo.
В одном проекте мы использовали такой подход, и все вроде как роботает. Но, пожалуй, его недостатком является то, что он не всегда очевиден, появляется инфраструктурный код, какие то новые абстракции.
Я бы посоветовал вместо классов предметной области (которые мапятся на БД) использовать в GUI специальные DTO или ViewModel классы, которые грузятся напрямую из БД с помощою NHibernate projections (или вообще загружать эти новые классы не используя NHibernate). То есть после загрузки, сессию NHibernate можно закрывать. Но тогда, изменять данные уже нельзя просто изменив состояние объекта — нужно использовать специальные команды для изменения.