Сьогодні у мене була гостра дискусія щодо нашої програми MVC. У нас є веб-сайт, написаний на MVC ( ASP.NET ), і він, як правило, слідує шаблону зробити щось на виду -> натиснути на контролер -> контролер будує модель (викликає менеджера, який отримує дані, будує модель в сам метод контролера) -> модель переходить до перегляду -> промивання та повторення.
Він сказав, що наш код занадто щільно пов'язаний. Наприклад, якби ми також хотіли настільний додаток, ми б не змогли використовувати наш існуючий код.
За його словами, рішення та найкраща практика - це створити API, а потім створити веб-сайт поверх свого API, а потім створити настільний додаток, мобільний додаток тощо дуже простий.
Мені це здається поганою ідеєю з різних причин.
У всякому разі, я, здається, не можу нічого знайти, гуглюючи, що могло б обговорити цю практику. Хтось має якусь інформацію про плюси, мінуси, навіщо це робити, чому не слід чи читати далі?
З деяких причин я вважаю це поганою ідеєю:
Це занадто абстрактно, щоб запустити свій бекенд з API. Ви намагаєтесь зробити його занадто гнучким, що зробить це незмінним безладом.
Усі речі, вбудовані в MVC, видаються марними, як ролі та автентифікація. Наприклад, атрибути та захист [Authorize]; вам доведеться згортати своє.
Всі ваші дзвінки API вимагають додавання інформації про безпеку, і вам доведеться розробити токен-систему і багато чого іншого.
Вам доведеться писати повні API-дзвінки для кожної функції, яку коли-небудь виконує ваша програма. Практично кожен метод, який ви хочете реалізувати, потребує використання API. Отримати / оновити / видалити для кожного користувача, плюс варіант для кожної іншої операції, наприклад оновити ім'я користувача, додати користувача до групи тощо тощо, і кожен з них буде виразним викликом API.
Якщо мова йде про API, ви втрачаєте всілякі інструменти, такі як інтерфейси та абстрактні класи. Такі речі, як WCF, мають дуже напружену підтримку інтерфейсів.
У вас є метод, який створює користувача або виконує якесь завдання. Якщо ви хочете створити 50 користувачів, ви можете просто зателефонувати йому 50 разів. Коли ви вирішите використовувати цей метод як API, ваш локальний веб-сервер може з назвою-pipe підключитися до нього, і це не має ніяких проблем - ваш клієнт настільного комп'ютера теж може його вдарити, але раптом ваше масове створення користувачів призведе до забивання API через Інтернет 50 разів, що не не добре Тож вам доведеться створити об'ємний метод, але насправді ви просто створюєте його для настільних клієнтів. Таким чином, у вас виникає необхідність: а) змінювати свій API на основі того, що з ним інтегрується, і ви не можете просто інтегруватися з ним, б) зробити набагато більше роботи, щоб створити додаткову функцію.
ЯГНІ . Якщо ви спеціально не плануєте написати два однаково функціонуючі програми, одну веб-програму та одну програму для Windows, наприклад, це велика кількість додаткових робіт з розробки.
Налагодження набагато складніше, коли ви не можете переступити до кінця.
Багато незалежних операцій, для яких потрібно буде багато назад і назад, наприклад, якийсь код може отримати поточного користувача, перевірте, чи користувач перебуває в ролі адміністратора, отримайте компанію, до якої належить користувач, отримайте список інших учасників, надішліть їх усім E-mail. Для цього потрібно буде багато викликів API або написання методу "замовити" конкретне завдання, яке ви хочете, де єдиною перевагою цього способу буде швидкість, але зворотний бік буде нестійким.
Можливо, ще кілька причин - це просто з моєї голови.
Мені це просто здається, якщо вам справді не потрібні два однакові програми, тоді це дійсно не варто. Я ніколи не бачив подібного додатку ASP.NET, вам доведеться написати два окремі додатки (API та ваш код) та керувати ними обома версіями (якщо на вашій сторінці користувача з’явиться нове поле, ви ' Вам доведеться одночасно оновлювати API та ваш споживчий код, щоб уникнути негативних наслідків або створити багато додаткової роботи для збереження його надійним).
Редагувати: Деякі чудові відповіді, починаючи добре розуміти, що це все означає зараз. Тож, щоб розширити питання, як би ви структурували додаток MVC для того, щоб слідкувати за цією структурою API?
Наприклад, у вас є веб-сайт, на якому відображається інформація про користувача. Під MVC у вас є:
Перегляд - (CS) HTML-сторінка, що відображає контролер UserViewModel - викликає GetUser () та створює UserViewModel, який передає класу диспетчерів перегляду (свого роду API), який має метод GetUser.
Контролер виконує GetUser (), але ви також хочете додаток для настільних ПК. Це означає, що ваш GetUser повинен бути виставлений через якийсь API. Вам може знадобитися TCP-з'єднання, або WCF, або, можливо, видалення. Ви також хочете мобільний додаток, який буде RESTful, оскільки стійкі з’єднання розмиті.
Тож ви б тоді написали API для кожного з них, веб-сервіс WCF, який має метод GetUser () і код просто так return new UserManager().GetUser()
? І метод mvc 4 web api, який робить те саме? Продовжуєте дзвонити GetUser безпосередньо у вашому методі контролера MVC?
Або ви вибрали б рішення, яке працювало б для всіх трьох (послуга веб-api REST) і будувати все на цьому, тому всі три програми здійснюють дзвінки API (mvc, на локальну машину).
І це просто теоретично досконалий сценарій? Я бачу великі накладні витрати в такому розвитку, особливо якщо вам доведеться розвиватися таким чином, що дозволить вам робити операції в RESTful способі. Я думаю, що дещо з цього було висвітлено у відповідях.
Редагувати 2: Прочитавши більше матеріалів, я поставив коментар нижче, що, думаю, може пояснити це. Питання - це трохи хитромудрий питання, я думаю. Якщо ви пишете свій бек-енд-інтерфейс в якості API, я збентежився, думаючи, що має існувати єдина веб-послуга, яка все (додаток mvc, настільний додаток, мобільний додаток) вимагає робити щось.
Я дійшов висновку, що те, що ви дійсно повинні зробити, це переконатися, що рівень вашої бізнес-логіки правильно відокремлений. Дивлячись на мій код, я це вже роблю - контролер зателефонує GetUser()
на менеджера, а потім створить з нього модель перегляду для візуалізації з видом. Тож дійсно, рівень бізнес-логіки - це API. Якщо ви хочете зателефонувати на нього з настільного додатку, вам потрібно буде написати щось на зразок послуги WCF, щоб полегшити його виклик. Навіть просто використання методу WCF, GetUser()
який містить код, return MyBusinessLayer.GetUser()
було б достатньо. Таким чином, API - це бізнес-логіка, а WCF / web api тощо - це лише титри коду, які дозволяють зовнішнім програмам викликати його.
Таким чином, є деякий накладний випадок, у якому вам доведеться загортати рівень вашої бізнес-логіки в різні API, залежно від того, що вам потрібно, і вам доведеться написати метод API для кожної операції, яку ви хочете, щоб інші ваші додатки робили, плюс вам потрібно буде розібратися з способом аутентифікації, але здебільшого це те саме. Запишіть свою ділову логіку в окремий проект (бібліотека класів), і у вас, мабуть, не виникне жодних проблем!
Сподіваємось, це тлумачення правильне. Дякуємо за всі дискусії / коментарі, які вони викликали