Nhibernate, Модель предметной области, Изменения, Отключен, Клонирован (Нужен лучший заголовок - но не могу выразить это ясно!) - PullRequest
1 голос
/ 24 февраля 2011

Извините за заголовок - надеюсь, вопрос прояснит то, что я хочу знать, тогда, возможно, кто-то может предложить лучший заголовок, и я его отредактирую!

У нас есть модель предметной области. Частью этой модели является набор «Активов», которые в данный момент есть у пользователя. Затем пользователь может создать «Действия», которые являются возможными будущими изменениями состояния этих «Активов». В настоящее время эти действия имеют метод «Применить» и ссылку на связанный с ними «Актив». Этот метод «Применить» вносит изменения в «Актив» и возвращает его.

В различных точках кода мы должны получить список активов, к которым будут применены любые будущие действия. Однако нам часто нужно делать это в рамках транзакции NHibernate, и поэтому, когда транзакция будет зафиксирована, изменения в «Активе» также будут сохранены - но мы не хотим, чтобы они были.

Мы прошли через различные способы сделать это

  • Клонирование версии «Актива» (чтобы он был отключен от Nhibernate), а затем применение «Действия» и возврат этой клонированной копии.

  • На самом деле, используя Nhibernate для отключения объекта перед его возвратом

Очевидно, что у каждого из них есть (массивные!) Недостатки.

Есть идеи? Дайте мне знать, если этот вопрос требует дальнейших объяснений и что я должен изменить название на!

Ответы [ 4 ]

1 голос
/ 26 февраля 2011

Вы можете управлять этим с помощью NHibernate, используя ISession.Evict (obj) или аналогичные методы, но, честно говоря, это звучит так, как будто вы упускаете концепцию домена.Я бы смоделировал это как:

var asset = FetchAsset();
var proposedAsset = asset.ApplyActionsToClone();

Предлагаемый актив будет клоном исходного актива с действиями, примененными к нему.Этот клонированный объект будет отключен от NHibernate и, следовательно, не будет сохранен при фиксации Unit of Work.Если применение действий стоит дорого, вы можете даже сделать следующее:

asset.ApplyProposedChanges(proposedAsset);
1 голос
/ 24 февраля 2011

Прошло много времени с тех пор, как я получил удовольствие от NHibernate, но не могли бы вы получить ресурсы, используя второй сеанс NHibernate? Внесенные в Актив изменения не будут сохранены при фиксации транзакции в первом сеансе.

1 голос
/ 26 февраля 2011

Я работал над аналогичной проблемой, где производительность также была проблемой, поэтому было невозможно перезагрузить агрегат с использованием вторичного (возможно, без сохранения состояния) сеанса.И поскольку сущности, которые необходимо было изменить «временно» там, где они очень сложны, я не мог легко их клонировать.

В результате я «вручную» откатил изменения в том, что будет активами вдело.Оказалось, хорошо работать.Мы сохраняли каждое действие, примененное к объекту, как список событий (в памяти).После использования события можно перечитать, а каждое изменение можно откатить с помощью встречного действия.

Если применить только небольшое количество действий, я бы сказал, что легко создатьответное действие для каждого, иначе можно было бы создать более общий механизм.

У нас было только четыре действия, поэтому мы пошли на ручное издание.

0 голосов
/ 24 февраля 2011

Звучит так, как будто вы хотите использовать Unit of Work wrapper , чтобы вы могли фиксировать или отменять изменения по мере необходимости.

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