Какова цель метода Rollback в шаблоне Unit of Work? - PullRequest
5 голосов
/ 20 января 2011

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

Q: Так почему так много документации по шаблону единицы работы относится к методам "Commit" и "Rollback"?

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

Обновление:

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

Ответы [ 2 ]

2 голосов
/ 20 января 2011

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

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

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

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

1 голос
/ 20 января 2011

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

...