Где я должен разместить запрос API в MVC?

25

Я строю веб-приложение, используя шаблон MVC. Следуя такой архитектуре, мы видим, что все методы, используемые для взаимодействия с базой данных, реализованы в модели .

Но что произойдет, если мне придется позвонить в службу, предоставляемую другими в Интернете? Например, я хотел бы получить доступ к API Facebook, чтобы получить всех подписчиков моей страницы, поэтому, где я разместил эти методы?

Очевидно, что представление не является хорошей идеей, потому что этот модуль предназначен для презентации, контроллер не должен использоваться для извлечения данных, но модель обычно предназначена только для взаимодействия с базой данных.

Итак, вы можете дать мне подсказку об этом? И, пожалуйста, можете ли вы сказать мне, если я делаю некоторые ошибки в архитектуре MVC?

Ema.jar
источник
2
Я думаю, что люди могли бы дать лучшие ответы, если бы вы перечислили некоторые библиотеки и фреймворки, которые вы используете для поддержки своего приложения MVC. Хотя шаблон MVC не зависит от технологии, не все фреймворки следуют ему в явном виде. Более того, большинство зрелых фреймворков уже имеют выдающуюся документацию, и знание того, какой из них вы используете, облегчит вам обращение к уже существующему объяснению, которое следует вашему образу мышления.
CLW
2
База данных? Источник данных? Это просто данные.
2
Есть так много мнений о том, что такое «MVC», что этот вопрос слишком абстрактен, чтобы на него отвечать.
RemcoGerlich
2
Кроме того, рассмотрите возможность вызова API из вашего кода Javascript внешнего интерфейса и вообще не затрагивайте его в бэкэнде "MVC".
RemcoGerlich
@Remcogerlich, поэтому я предложил добавить фактическую реализацию, на которую он смотрит. Он мог иметь дело с бэкэндом и внешним интерфейсом mvc. У нас может быть и другая модель, которая лучше объясняет эти различия.
CLW

Ответы:

37

Модель не ограничивается взаимодействием с базой данных, модель отвечает за получение и манипулирование данными.

Поэтому, на ваш взгляд и контролер, не должно иметь значения, поступают ли данные из базы данных или из веб-сервиса или даже являются абсолютно случайными, поэтому вы должны делать это в модели.

MVC - это шаблон представления, который разделяет только разные уровни представления.

Это не значит, что эта модель должна быть беспорядочным спагетти-кодом. Ваша модель также может быть многоуровневой, но контроллер не должен знать, откуда поступают данные.

Открытый метод в вашей модели может быть структурирован следующим образом (псевдокод), который может вызываться вашим контроллером:

public MyDataClass getData(int id) {
    WebServiceData wsData = WebService->getData(id);
    DatabaseData dbData = ORM->getData(id);
    return new MyDataClass(wsData, dbData);
}

WebServiceи, ORMвозможно, должны быть экземплярами интерфейсов, которые могут быть заменены имитациями посредством внедрения зависимостей, но ваши контроллеры и представления не должны изменяться в целях тестирования.

отстой
источник
8
Модель не должна иметь никакой логики и, следовательно, не взаимодействовать напрямую ни с чем. Шаблон MVC явно требует размещения всей логики в контроллерах. Эти контроллеры должны связываться с БД, API и т. Д. По мере необходимости и обновлять модель по мере необходимости. Это делает вашу модель независимой от технологии и гарантирует, что она служит не чем иным, как механизмом хранения, который можно передавать в различные представления для представления и контроллеры для дополнительных манипуляций.
CLW
3
@CLW: модель! = Модель данных. Более подробную информацию можно найти в другом месте, например, stackoverflow.com/a/14045514/124983
Residuum
2
@CLW: бизнес-логика не должна быть в M, V или C. Модели - это абстракция хранилища данных, представления и контроллеры - это ваш пользовательский интерфейс. Они являются периферией реального создаваемого вами приложения, которое должно быть «просто кодом», которое не должно знать о таких вещах, как базы данных и сеть.
RemcoGerlich
2
«Модельная» часть интерпретируется многими сотнями разных способов. Меня всегда учили, что модель - это представление. Модельный поезд представляет собой настоящий поезд с небольшими движущимися частями, которые движутся так же, как настоящий. Точно так же модель в вашем приложении представляет собой систему и процессы, которые вы создаете для замены программного обеспечения. Как таковые, модели имеют поведение . Такое поведение включает в себя вашу «бизнес-логику». Таким образом, когда вы игнорируете чистый доступ к данным CRUD, пользовательский интерфейс и взаимодействие, то, вероятно, остается ваша «модель» - классы доменов, бизнес-правила и т. Д.
anaximander
1
@RemcoGerlich Я ничего не говорил о бизнес-логике. Я просто заявил, что, поскольку большинство интерпретаций MVC требуют, чтобы модель была не чем иным, как простой структурой, представляющей состояние вашего приложения, ответственность за контакт с БД, API и т. Д. Не должна быть возложена на модель, поскольку она должна быть логика свободна. Обязанность связи с базой данных должна ложиться либо на контроллер, либо на другой объект, управляемый контроллером.
CLW
12

Существует общее (намеренное?) Недоразумение о том, что такое M, V и C. Не о роли , которую они принимают, но то , что это они.

В оригинальном графическом интерфейсе MVC для настольных компьютеров это были модули . Обычно в приложении их было несколько, иногда работающих в триплетах, иногда имеющих различные представления и модели, которые несколько контроллеров могли бы смешивать и сопоставлять.

В веб-фреймворках, OTOH, они, как правило, рассматриваются как слои , где они являются только одним из каждого и имеют дело главным образом с охватом некоторого нижестоящего уровня абстракции: «уровень модели абстрагирует базу данных», «уровень представления реализует представление», «контроллер слой обрабатывает пользовательский ввод ".

Таким образом, я бы сказал , что у вас уже есть в модели, посвященной взаимодействию с базой данных, и теперь просто создать еще одну модель, чтобы иметь дело с исходным API. Если вы сделаете их максимально похожими, то большая часть кода контроллера и представления может беспрепятственно работать с любой моделью.

Хавьер
источник
1
Согласовано: модель (ы) всегда должны были быть всей проблемной областью. В сложных приложениях это всегда должно было быть основной частью кода. Они состояли из всего кода, который не изменился бы, если вы измените пользовательский интерфейс (скажем, с веб-сайта на графический интерфейс или даже приложение командной строки). Подумайте о компиляторе. Лишь очень небольшая часть кода изменится, если вы перейдете от интерфейса командной строки к графическому интерфейсу или даже к веб-интерфейсу. Все смелости такого приложения являются моделями.
Кевин Кэткарт
1
В первоначальном использовании термина Smalltalk каждый элемент управления пользовательского интерфейса в интерфейсе имел свою собственную модель, представление и контроллер.
RemcoGerlich
5

Частично трудность любого обсуждения MVC заключается в том, что разные группы используют его для обозначения разных вещей. Реализация MVC, используемая, скажем, в приложении Rails, была бы почти неузнаваема для тех, кто пишет приложение Swing. В той степени, в которой MVC все еще является четко определенной вещью, это скорее набор руководящих принципов (отделить основное приложение от его визуального представления, обеспечить гибкие механизмы, позволяющие соединить их вместе), которые могут быть реализованы различными способами. пути.

В самом деле, существует тенденция к тому, чтобы разные конструкции, основанные на MVC, имели разные имена (см. Эту статью Мартина Фаулера, чтобы обсудить это), или даже отказались от точного именования - например, AngularJS описывает себя как модель-представление-что угодно фреймворк.

Поэтому трудно ответить, не зная, с какой версией «MVC» вы работаете. Однако запрос API обычно является частью основного приложения (той части, которая не должна изменяться, если вы решите использовать другое визуальное представление), которая во многих реализациях будет полностью содержаться в модели.

James_pic
источник
2

Здесь модель описывается так:

Модель хранит данные, которые извлекаются в контроллер и отображаются в представлении. Всякий раз, когда происходит изменение данных, оно обновляется контроллером.

Я бы сказал, что контроллер либо включает логику вызова службы, либо вызывает отдельный Serviceобъект. Если служба отдельная, вы можете легче создавать тесты, например, если подключение к службе по сети невозможно, некоторые TestServiceмогут предоставить ответы от Serviceлокально.

Также проверьте этот ответ, который предполагает, что Контроллер вызывает сервис.

значение NULL
источник
2

Ваша модель никогда не должна содержать никакого реального кода и должна рассматриваться как нечто большее из сообщения или структуры, используемой для управления контентом, управляемым контроллером и отображаемым представлением.

Ваш контроллер должен нести ответственность за обращение к любым API, базам данных, сервисам и т. Д. ... с просьбой об изменении и управлением любыми необходимыми обновлениями модели.

Вся сила паттерна MVC заключается в том, что он отделяет логику (контроллер) от вида и состояния (модель). При этом вы теперь гарантируете, что только код в контроллере может создавать побочные эффекты, поскольку представлению и модели просто не разрешено вносить изменения.

Это также позволяет лучше повторно использовать код, так как модель может быть разделена между различными контроллерами и представлениями.

ТЛС
источник
4
Я думаю, что когда вы говорите «модель» здесь, вы имеете в виду «модель представления», которая является отдельной вещью ИМО. Модель представления получает данные от контроллера к представлению, и, как таковая, является либо деталью реализации представления, либо аспектом связи между представлением и контроллером, который в действительности не вписывается ни в один из них (зависит от того, как вы его видите). «Модель» в MVC относится к модели системы - представлению системы, которая включает в себя ее данные, структуру и поведение. Модель - это состояние и логика; Контроллер - это то, что заставляет логику работать и изменять состояние при манипулировании представлением.
Анаксимандр
@anaximander Нет. Я имею в виду Модель в довольно строгой интерпретации MVC (см. Википедию, Microsoft MVC, Шаблоны Head First Design и т. д.). В этих случаях Модель является не чем иным, как простой структурой для передачи данных. вокруг и нет такой вещи, как модель представления. Хотя реализация Microsoft MVC добавляет в модель различные атрибуты, это больше для удобства, чем для чего-либо еще. В итоге цель шаблона MVC состояла в том, чтобы упростить эффективную практику разделения кода и ограничить побочные эффекты.
CLW
1

Может быть, далеко отсюда, но вот как я отношусь к WebApps и работе с [сложными] удаленными API во многих случаях:

Я бы сделал это классом (то есть библиотекой методов смягчения данных) вместо модели (то есть стеком функций смягчения данных). Кажется, что он будет действовать более прозрачно, более независимо от логики / схемы, и вы можете использовать его где угодно, не загружая-> вызывая саму модель / контроллер каждый раз, когда вы захотите его использовать. Логика по-прежнему разделена, точка данных по-прежнему гибкая, и она кажется более открытой для взаимодействия в странных случаях, таких как стекирование clientAJAX-> appJSON-> appLIB-> remoteAPI-> remoteJSON и т. Д. Для косвенного опроса конечной точки.

dhaupin
источник