WedX - журнал о программировании и компьютерных науках

Какова цель метода Rollback в шаблоне Unit of Work?

Насколько я понимаю, класс UnitOfWork предназначен для представления концепции бизнес-транзакции в предметной области. Он не должен напрямую представлять транзакцию базы данных, которая является деталью только одной возможной реализации.

Вопрос. Почему так много документации по шаблону Unit of Work ссылается на методы "Commit" и "Rollback"?

Эти концепции ничего не значат для предметной области или для экспертов в предметной области. Бизнес-транзакция может быть "завершена", поэтому UnitOfWork должен предоставлять метод "Complete". Точно так же вместо метода «Откат» не следует ли моделировать его как «Очистить»?

Обновление:

Ответ. Оба приведенных ниже ответа верны. Есть два варианта UoW: регистрация объекта и регистрация вызывающего абонента. При регистрации объекта откат служит для отмены изменений всех объектов в памяти. При регистрации вызывающего объекта Rollback служит для очистки всех записанных изменений, так что последующий вызов Commit ничего не сделает.


Ответы:


1

Шаблон проектирования «Единица работы», по крайней мере, как определено Фаулером в Шаблоны архитектуры корпоративных приложений – это деталь реализации, касающаяся сопоставления объект-реляционное сохраняемости. Это не объект, определенный в Domain Driven Design.

Таким образом, он не должен быть ни частью бизнес-обсуждения, ни сущностью, которая напрямую представлена ​​в модели предметной области — возможно, за исключением метода commit(). Вместо этого его целью является отслеживание «чистых» и «грязных» бизнес-сущностей — объектов из модели предметной области, доступных клиентам. Цель состоит в том, чтобы разрешить множественные взаимодействия — в запросах веб-контекста — с моделью предметной области без необходимости каждый раз читать и писать из постоянства (обычно из базы данных).

Бизнес-сущности вызывают его, когда вызываются их методы. Когда их состояние изменяется, они регистрируются как грязные в единице работы. Затем commit() единицы работы обрабатывает всю персистентную транзакцию с точки зрения записи графа объектов, а rollback() означает восстановление состояния сущностей до того состояния, в котором они были. Так что его реализация очень сильно просачивается в «абстракцию», но ее цель очень ясна.

С другой стороны, «Отменить» и «Завершить» не обязательно однозначно сопоставляются с этим определением. «Отменить» или «Очистить» могут только частично откатить граф объекта, например, в зависимости от бизнес-контекста. В то время как «Complete» вполне может изменять состояние некоторого объекта, а также фиксировать график. Таким образом, я бы поместил эти методы с бизнес-значением в объект Service Layer или Aggregate Root.

20.01.2011
  • Интересно, спасибо. Хотя я склонен не согласиться с тем, что UoW относится только к СУБД (как насчет объектных БД или транзакционной памяти). В любом случае, ваш ответ побудил меня провести дополнительные исследования, и я наткнулся на takacsot.freeblog.hu/ Файлы/martinfowler/unitOfWork.html . Я вижу, что есть два типа UoW: регистрация вызывающего абонента и регистрация объекта. Я использовал регистрацию объектов (через сеансы NHibernate), но я не знал явно о шаблоне UoW, стоящем за этим. Спасибо еще раз. 20.01.2011
  • @gWiz: вы не согласны с тем, что UoW - это деталь реализации? Если вы согласны, единственное, что я могу сказать, это то, что методы, которые вы обсуждаете с бизнес-пользователем, не отображаются на UoW. Что касается РСУБД по сравнению с другой устойчивостью, это семантический аргумент, вашему бизнес-пользователю все равно - UofW применяется ко всему - мой ответ был обновлен, поскольку он не предназначался для применения только к реляционным. 21.01.2011
  • Интересно. Я думаю, что UoW — это деталь реализации, но предметная концепция бизнес-транзакций, которая важна для экспертов в предметной области. Эксперты не говорят Commit или Rollback, но они могут сказать, что если B не принимается, то не меняйте A. Это только потому, что идея бизнес-транзакции скрыта/ожидаема для них. Я бы сказал, что в целом Службы в DDD должны иметь в названии Transaction (и могли бы использовать UoW в реализации). 21.01.2011
  • Хотя я думаю, что оба ответа верны, я принимаю ваш, потому что благодаря ему я узнал что-то новое, а не просто подтвердил свои существующие знания. 21.01.2011

  • 2

    Я согласен. Я предполагаю, что он использует термины «откат» и «фиксация», потому что они действительно известны (и раскрывают намерения, особенно для программистов). Однако я думаю, что правильнее было бы использовать термин «Полный». Что касается "Clear", то я не склонен с вами соглашаться. Я не думаю, что любой эксперт в предметной области согласится с тем, что вы должны «очистить» бизнес-транзакцию. На мой взгляд, более подходящим термином является «отменить».

    20.01.2011
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: wedx@cp9.ru