просто реализуешь многослойную архитектуру(action, handler, subServices, repository, entity), вся логика происходит в хэндлере, используя возможности ядра(вспомогательные сервисы, репы, сущности), а контроллеры оставляешь тонкими, все что там должно остаться - маппинг Request на аргументы хэндлера, и генерация Response по нужному вам контракту