У нас есть три слоя в нашем приложении. Сервисный уровень для предоставления внешнего API. Уровень BO для нашей бизнес-логики и уровень DAO для нашего соединения с базой данных.
Допустим, каждый раз, когда мы обновляем файл, мы также хотим что-то изменить в папке, например, «дата последнего изменения». Это должно быть сделано в транзакции. Либо это успешно, и файл и папка редактируются. Или происходит сбой, и транзакция откатывается, так что оба объекта находятся в предыдущем состоянии.
Действие «Редактировать папку, когда файл редактируется» - это чисто бизнес-логика. Так что это будет означать, что он принадлежит слою BO. Однако мы используем Objectify для нашей базы данных, поэтому для запуска транзакции нам нужно вызвать ofy (). Transact (...). Если мы вызовем эту функцию на уровне BO, это нарушит наш дизайн, поскольку на нашем уровне Business будут специфические вызовы базы данных (Objectify).
Какое будет чистое решение для этой проблемы?
источник
FileBO
позвонитьFolderBO.edit(newDate)
из-за проблемы транзакции?Ответы:
То, как вы сокращаете свои транзакции, действительно является бизнес-логикой. Итак, позвольте вашему уровню DAO предоставить независимый от db framework API для
transact
метода, который вы упомянули (и, вероятно, для таких вещей, какcommit
иrollback
). Затем вы можете использовать его со своего уровня BO, не делая его зависимым от вашей базы данных или вашей базы данных.источник
Похоже, что Objectify разработан для атомарных транзакций ( Google Application Engine Transactions ). Это потребует от вас разработки собственной абстракции Управления транзакциями .
В таком случае. абстракция продолжается Как мне делегировать управление транзакциями верхним уровням?
@DocBrown подход выглядит для меня быстрее и чище решения реализовать в к данной архитектуре ( многоуровневая архитектура ).
Из-за того, что мы пропускаем слишком много информации о приложении и его контексте, решение Doc также кажется мне наиболее безопасным.
Однако я бы посоветовал взглянуть на шаблон проектирования UnitOfWork для бизнес-уровня . Я думаю, что это подходит для управления транзакциями, заданного Objectify .
Вкратце, шаблон призван инкапсулировать бизнес-правила в бизнес-операции (единицы работы). Шаблон допускает наследование между Б.Ц. и, насколько я вижу, Objectify тоже. Он даже поддерживает композицию. Так либо по составу или наследования, подход позволяет сложные B.Ts .
Применительно к данной архитектуре, будет выглядеть так:
источник