Ну, у каждого дела есть свои достоинства.Но обычно в реальных случаях они разные.
Концептуально, то, что вы выставляете как API, вероятно, будет отличаться от того, что вы храните в базе данных, если только ваш сервис не очень тупой.
3 слоя разделены дляпричина.
Контроллер выступает в качестве внешнего интерфейса, получающего запросы в определенном формате.Это может быть полезная нагрузка JSON из запроса RESTful, это может быть просто отправка простой старой формы.Он выполняет проверку и предварительную обработку запроса, который должен быть передан другим службам или компонентам.
Служба действует как уровень бизнес-логики.То, что было передано в запросе, не обязательно отображает один в один на то, что обрабатывается на этом уровне.Он может вызывать другие службы, он может разбить запрос на более мелкие отдельные части, он может даже поставить запрос в очередь для последующей обработки, как это обычно делается в типах архитектур CQRS.Он может преобразовать полученный запрос в объекты для передачи в хранилище.Кроме того, служба может использоваться другими службами или несколькими контроллерами.
Хранилище 1016 * затем обрабатывает логику с объектами базы данных и их взаимосвязями.Объекты, которые он обрабатывает, будут более согласованы с таблицами базы данных и, будучи объектами, будут иметь более реляционный вид дизайна.
Еще одна вещь, которую вы должны иметь в виду, это то, что внутренняя реализация и репозиторий могут быть смоделированы не так, как API.Требуется много навыков и внимания для создания API, который абстрагируется до нужных уровней, является чистым и достаточно дружественным к пользователю, и большинство лучших практик предлагают на самом деле выполнить этот «контракт в первую очередь», не позволяя реализации API влиять на ваш DTO-дизайн..