5

Как я понимаю, класс UnitOfWork предназначен для представления концепции бизнес-транзакции в домене. Он не должен представлять собой транзакцию базы данных, которая представляет собой деталь только одной возможной реализации.Какова цель метода отката в шаблоне Unit of Work?

Вопрос: Так почему же так много документации о шаблоне Единицы работы относится к методам «Зафиксировать» и «Откат»?

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

Update:

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

ответ

2

Схема проектирования единицы работы, по крайней мере, как определено Фаулером в Patterns of Enterprise Application Architecture - представляет собой деталь реализации, относящуюся к объекту- реляционная сопоставление персистентности. Это не сущность, определенная в Evans Domain Driven Design.

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

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

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

+0

Интересно, спасибо. Хотя я склонен не согласиться с тем, что UoW относится только к РСУБД (что касается объектных БД или транзакционной памяти). В любом случае, ваш ответ побудил меня сделать больше исследований, и я наткнулся на http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html. Я вижу, есть два типа UoW: регистрация звонящего и регистрация объектов. Я использовал регистрацию объектов (через сеансы NHibernate), но я не был явно осведомлен о шаблоне UoW.Еще раз спасибо. –

+0

@gWiz: вы не согласны с UoW - это деталь реализации? Если вы согласны, только точка, с которой я сталкиваюсь, - это методы, которые вы обсуждаете с бизнес-пользователем, не отображаются в UoW. Что касается СУБД по сравнению с другой персистентностью, это семантический аргумент, ваш бизнес-пользователь все равно не заботится - UofW применяется ко всему - мой ответ был обновлен, поскольку он не означает, что он применяется только к реляционным. – orangepips

+0

Интересно. Я думаю, что UoW - это детализация реализации, а концепция домена «бизнес-транзакции», которая важна для экспертов домена. Эксперты не говорят «Commit» или «Rollback», но они могут сказать «если B не принят, а затем не меняет A». Это связано только с тем, что идея бизнес-транзакции скрыта/ожидается для них. Я бы сказал, что в общем случае службы DDD должны иметь «транзакцию» в названии (и могли бы использовать UoW в реализации). –

1

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