Есть ли какие-либо рекомендации, лучшие практики или хорошие статьи по предоставлению интеграционных хуков?
Допустим, я занимаюсь разработкой системы заказов через Интернет. В конце концов я бы хотел, чтобы мой клиент мог написать некоторый код, упаковать его в jar-файл, сбросить его в путь к классам, и это изменило бы поведение программного обеспечения.
Например, если поступит заказ, код
1. может отправить электронное письмо или смс
2. может записать некоторые дополнительные данные в базу данных
3. может изменить данные в базе данных или решить, что заказ не должен быть сохранен в базе данных (отменить сохранение данных)
Точка 3 довольно опасна, поскольку слишком сильно мешает целостности данных, но если мы хотим, чтобы интеграция была настолько гибкой, это выполнимо?
Варианты пока что
1. обеспечить крючки для конкретных действий, например, если это произойдет, вызовите этот метод, клиент напишет реализацию для этого метода, хотя это слишком жестко
2. Механизм, похожий на фильтры сервлетов, есть код перед тем, как фактическое действие выполнено, и код после, не совсем уверенный, как это может быть спроектировано, хотя
Мы используем Struts2, если это имеет значение.
Эта интеграция должна быть способна обнаруживать «изменение состояния», а не только «конечное состояние» после выполнения действия ядра.
Например, если заказ меняет состояние с «Выполняется» на «Платно», он что-то делает, но если он меняется с «Черновик» на «Платно», он ничего не должен делать.
Основным действием в этом случае будет загрузка объекта заказа. из базы данных, изменив состояние на Платное и сохранив его снова (или выполнив обновление sql).