Nhibernate и ISession - PullRequest
       9

Nhibernate и ISession

1 голос
/ 11 июля 2009

Допустим, у меня есть простое представление, которое отображает название продукта и было ли оно прекращено. Я вытаскиваю данные из базы данных Northwind. Я использую простой шаблон представления модели и шаблон DAO с NHibernate. Когда форма загружается, у меня есть пользовательский интерфейс с кнопкой загрузки и кнопкой сохранения. Если я нажимаю кнопку «Загрузить», то в моем коде я просто передаю вызов своему докладчику для загрузки данных. Предварительный центр вызывает DAO, чтобы получить данные и заполнить представление данными. Чем я нажал кнопку Сохранить. снова мой код передает вызов докладчику. Презентатор должен иметь объект сеанса, который был создан на Load, для выполнения оптимистичного параллелизма, отслеживания изменений и т. Д. *

Итак, мой вопрос: где я могу создать свой объект ISession, чтобы он мог выполнять отслеживание изменений и оптимистичный параллелизм?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2009

Поскольку вы используете MVP, я предполагаю, что это приложение для настольного компьютера, а не веб-приложение. UnitOfWork - хороший шаблон для этого, как и « Persistent Conversation ». Ayende недавно написала отличную статью о создании настольного приложения с помощью nhibernate , так что я обязательно на это посмотрю.

0 голосов
/ 11 июля 2009

HTTP не имеет состояния. Ваша единица работы существует только на стороне сервера. Что касается нажатия «Загрузить», тогда ваше UOW просто извлекает запись и сопоставляется с вашей моделью представления. «Сохранить» и единица работы начинается, когда вы попадаете на сервер - вместо того, чтобы быть в процессе загрузки, отредактируйте в браузере, а затем вернитесь на сервер.

Реализация, при которой вам не следует хранить ISession в памяти (в вашем случае объект сеанса ASP.Net), это верный быстрый способ исчерпания памяти и неуправляемых ресурсов ado.net. Существуют различные примеры UOW, которые некоторые люди предпочитают связывать ISession с HTTP-контекстом в begin_request и размещать в end_request, вы, конечно, можете быть более детализированными, но во всех случаях он никогда не существует дальше этого.

В упрощенной системе при нажатии кнопки «Сохранить» вам нужно будет извлечь Продукт из базы данных, используя идентификатор (скрытое поле или что-то еще), установить свойства из Request.Form, а затем обновить в базы данных.

Что касается параллелизма. Если вы записали метку времени или инкрементную версию в скрытом поле

<input type="hidden" name="version" value="12"/>

Затем, когда вы нажимаете Сохранить, вы извлекаете Продукт из базы данных, проверяете, совпадает ли номер версии в Request.Form, и затем сохраняете, если не вернете пользователю, что данные изменились с момента последнего получения, вы бы нравится продолжать? В NHibernate есть поля отметок времени / версии, поэтому сравнение выполняется, когда вы действительно попадаете в БД, как правило, в предложении where в обновлении, поэтому в этом случае он даже учитывает изменения в момент фиксации.

Существуют более сложные и изощренные способы, но обычно вы не можете / не должны вставлять ISession в объект Session asp.net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...