@Oldfag смотри какая схема может существовать. Рассмотрим одну функцию твоего приложения. Пусть это будет показ пользователя из бд по id. У тебя есть 2 источника входящих данных, пусть это будет http и console. Ты делаешь по одному обработчику на эти источники. Обработчики приводят входящие данные к универсальному виду (пусть это будет какой-нибудь класс DTO, который просто хранит данные. Можешь сделать по одному DTO на каждый входящий тип данных. Использование словарей и чего-либо такого, что есть у тебя в языке, я не советую, т.к. это очень неявный путь). У тебя будет контроллер, который никак не завязан на http. Он будет универсальный. На вход в контроллер будет DTO с userId. Контроллер запихает это в модельку и получит от неё результат, тоже в виде DTO юзера и общий класс представления (пусть это будет UserView). Потом этот результат контроллер вернет в слой обработки запросов (консоль или http). Обработчик запросов выберет подходящий вью. Если запрос был по http, то это будет либо HtmlUserView или JsonUserView. Если запрос был через консоль, то это будет ConsoleUserView. И отдаст на выход. Логично, что все классы *UserView должны иметь единый интерфейс типа *
UserView.show(UserDTO user). Тип такого