Куди слід поставити запит API в MVC?


25

Я будую веб-додаток за допомогою шаблону MVC. Слідуючи такому типу архітектури, ми бачимо, що всі методи, що використовуються для взаємодії з базою даних, реалізовані в моделі .

Але що трапиться, якщо мені доведеться зателефонувати в службу, яку відкрили інші в Інтернеті? Наприклад, я хотів би отримати доступ до API Facebook, щоб отримати весь підписник моєї сторінки, тож, куди я кладу ці методи?

Очевидно, що представлення не є хорошою ідеєю, оскільки цей модуль присвячений презентації, контролер не повинен використовуватися для отримання даних, але модель зазвичай присвячена лише взаємодії з базою даних.

Отже, чи можете ви дати мені якусь підказку щодо цього? І будь ласка, чи можете ви сказати мені, чи роблю я якісь помилки щодо архітектури MVC?


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
відстій

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, як правило, є частиною основної програми (тієї частини, яка не повинна змінюватися, якщо ви вирішите використовувати інше візуальне подання), яка в багатьох реалізаціях повністю міститиметься в моделі.


2

Тут модель описана так:

Модель зберігає дані, які отримуються в контролер і відображаються у вікні перегляду. Щоразу, коли відбувається зміна даних, вони оновлюються контролером.

Я б сказав, що контролер або включає логіку виклику служби, або викликає окремий Serviceоб'єкт. Якщо служба окрема, ви можете легше створити тести, скажімо, якщо підключення до послуги через мережу неможливе, деякі TestServiceможуть надати відповіді на Serviceмісцях.

Також ознайомтеся з цією відповіддю, яка говорить про те, що контролер викликає службу.


2

Ваша модель ніколи не повинна містити фактичного коду, і її слід розглядати як більше повідомлення або структуру, яка використовується для управління вмістом, що маніпулює контролером і відображається представленням зображення.

Ваш контролер повинен нести відповідальність за зв'язок з будь-якими API, базами даних, службами тощо ..., вимагаючи зміни та керування будь-якими необхідними оновленнями моделі.

Вся міцність шаблону MVC полягає в тому, що він відокремлює логіку (контролер) від подання та стану (модель). Тим самим вам гарантовано, що тільки код у контролері може створювати побічні ефекти, оскільки представлення та модель просто не дозволяють вносити зміни.

Це також дозволяє краще використовувати код, оскільки модель може ділитися між різними контролерами та видами.


4
Я думаю, коли ви говорите тут "модель", ви посилаєтесь на "viewmodel", що IMO - це окрема річ. Модель перегляду отримує дані від контролера до перегляду, і як такої є або деталізацією реалізації Погляду, або аспектом зв'язку між Переглядом та Контролером, який насправді не вписується ні в один із них (залежить, як ви це бачите). "Модель" у MVC відноситься до системної моделі - уявлення системи, яка включає в себе її дані, структуру та поведінку. Модель - стан і логіка; Контролер - це те, що змушує запускати логіку і змінювати стан при маніпулюванні Переглядом.
anaximander

@anaximander Ні. Я маю на увазі Модель у досить суворій інтерпретації MVC (див. Вікіпедія, Microsoft MVC, шаблони дизайну Head First тощо). У цих випадках Модель є не що інше, як проста структура для передачі даних навколо, і немає такої речі, як модельний вигляд. Хоча впровадження Microsoft MVC додає моделі різні атрибути, це більше для зручності. Зрештою, метою схеми MVC було сприяння належній практиці розділення коду та обмеженню побічних ефектів.
CLW

1

Тут може бути далеко, але я так думаю про WebApps та роботу з [складними] віддаленими API в багатьох випадках:

Я б зробив це класом (тобто бібліотекою методів пом’якшення даних) замість моделі (тобто, стека функцій пом'якшення даних). Схоже, це діятиме більш прозоро, більш логічно / схематично, і ви можете використовувати його куди завгодно, не завантажуючи-> викликаючи модель / контролер кожного разу, коли захочете його використовувати. Логіка все ще відокремлена, точка даних все ще гнучка, і вона здається більш відкритою для сумісності у дивних випадках, таких як укладання clientAJAX-> appJSON-> appLIB-> remoteAPI-> remoteJSON тощо для опосередкованого запитання кінцевої точки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.