Сегодня у меня была горячая дискуссия о нашем приложении MVC. У нас есть веб-сайт, написанный на MVC ( ASP.NET ), и он обычно следует шаблону «сделать что-то» в представлении -> нажать на контроллер -> контроллер строит модель (вызывает менеджера, который получает данные, строит модель в Сам метод контроллера) -> модель идет на просмотр -> промыть и повторить.
Он сказал, что наш код был слишком тесно связан. Например, если бы мы хотели настольное приложение, мы не смогли бы использовать наш существующий код.
Он сказал, что решение и лучшая практика - это создать API, а затем создать свой сайт поверх вашего API, а затем создать настольное приложение, мобильное приложение и т. Д. Очень просто.
Это кажется плохой идеей для меня по разным причинам.
Во всяком случае, я не могу найти ничего, прибегая к помощи, которая могла бы обсудить эту практику. У кого-нибудь есть какая-либо информация о плюсах, минусах, почему вы должны, почему вы не должны или дальше читать?
Некоторые причины, по которым я считаю это плохой идеей:
Это слишком абстрактно, чтобы запускать свой бэкэнд из API. Вы пытаетесь сделать его слишком гибким, что сделает его неуправляемым беспорядком.
Все вещи, встроенные в MVC, кажутся бесполезными, например, роли и аутентификация. Например, [Авторизовать] атрибуты и безопасность; Вы должны будете катиться самостоятельно.
Все ваши вызовы API потребуют прикрепленной информации о безопасности, и вам придется разработать систему токенов и еще много чего.
Вы должны будете написать полные вызовы API для каждой функции, которую когда-либо будет выполнять ваша программа. Практически каждый метод, который вы хотите реализовать, должен быть запущен из API. Получить / Обновить / Удалить для каждого пользователя, плюс вариант для каждой другой операции, например, обновить имя пользователя, добавить пользователя в группу и т. Д. И т. Д., И каждый из них будет отдельным вызовом API.
Вы теряете все виды инструментов, таких как интерфейсы и абстрактные классы, когда дело доходит до API. Такие вещи, как WCF, имеют очень слабую поддержку интерфейсов.
У вас есть метод, который создает пользователя или выполняет какую-то задачу. Если вы хотите создать 50 пользователей, вы можете просто позвонить 50 раз. Когда вы решите использовать этот метод в качестве API, ваш локальный веб-сервер может подключиться к ним по именованным каналам, и это не проблема - ваш настольный клиент тоже может поразить его, но внезапно ваше массовое создание пользователя будет включать в себя 50 ударов API по Интернету, что не не хорошо Таким образом, вы должны создать массовый метод, но на самом деле вы просто создаете его для настольных клиентов. Таким образом, вам в конечном итоге придется: а) модифицировать свой API в зависимости от того, что с ним интегрируется, и вы не сможете просто напрямую интегрироваться с ним, б) проделать гораздо больше работы для создания дополнительной функции.
ЯГНИ . Если вы специально не планируете писать два одинаково функционирующих приложения, например, одно веб-приложение и одно приложение Windows, это огромный объем дополнительной разработки.
Отладка намного сложнее, когда вы не можете пройти сквозной.
Множество независимых операций, которые потребуют много взад и вперед, например, некоторый код может получить текущего пользователя, проверить, что пользователь в роли администратора, получить компанию, к которой принадлежит пользователь, получить список других участников, отправить их всех электронное письмо. Это потребовало бы большого количества вызовов API или написания специального метода для конкретной задачи, которую вы хотите, где единственным преимуществом этого специального метода была бы скорость, а недостатком - негибкость.
Вероятно, есть еще несколько причин, по которым это просто не в моей голове.
Мне просто кажется, что если вам действительно не нужны два одинаковых приложения, это действительно того не стоит. Я никогда не видел приложения ASP.NET, созданного подобным образом, вам нужно было бы написать два отдельных приложения (API и ваш код), а также управлять версиями обоих (если ваша страница пользователя получает новое поле, вы ' пришлось бы одновременно обновлять API и ваш потребляющий код, чтобы избежать побочных эффектов или приложить много дополнительной работы для поддержания его надежности).
Изменить: некоторые отличные ответы, действительно начинают понимать, что все это значит сейчас. Итак, чтобы расширить мой вопрос, как бы вы структурировали приложение MVC, чтобы следовать этой структуре API?
Например, у вас есть веб-сайт, который отображает информацию о пользователе. Под MVC у вас есть:
View - (CS) HTML-страница, на которой отображается контроллер UserViewModel. Вызывает GetUser () и создает UserViewModel, который он передает классу View Manager (своего рода API), в котором есть метод GetUser.
Контроллер выполняет GetUser (), но вам также нужно приложение для настольного компьютера. Это означает, что ваш GetUser должен быть представлен через какой-то API. Возможно, вам понадобится TCP-соединение, либо WCF, либо, возможно, Remoting. Вы также хотите мобильное приложение, которое будет RESTful, поскольку постоянные соединения ненадежны.
Итак, не могли бы вы написать API для каждого из них, веб-сервис WCF, у которого есть метод GetUser (), а код просто есть return new UserManager().GetUser()
? И метод веб-API MVC 4, который делает то же самое? Продолжая вызывать GetUser непосредственно в методе контроллера MVC?
Или вы выбрали бы решение, которое будет работать для всех трех (REST-сервис веб-API), и построите все на этом, чтобы все три приложения выполняли вызовы API (mvc для локальной машины).
И это просто теоретически совершенный сценарий? Я вижу большие издержки при разработке таким способом, особенно если вам нужно разрабатывать таким образом, который позволит вам выполнять операции в режиме RESTful. Я думаю, что часть этого была освещена в ответах.
Редактировать 2: После прочтения большего количества вещей, я поместил комментарий ниже, который, я думаю, может объяснить это. Я думаю, что это вопрос с подвохом. Если вы пишете свой бэкэнд в качестве API, я бы запутался, думая, что должен быть один веб-сервис, который все (mvc-приложение, приложение для ПК, мобильное приложение) вызывает, чтобы что-то делать.
Я пришел к выводу, что на самом деле вы должны убедиться, что ваш уровень бизнес-логики правильно отделен. Глядя на мой код, я уже делаю это - контроллер вызовет GetUser()
менеджера, а затем создаст из него модель представления для визуализации с помощью представления. Итак, действительно, уровень бизнес-логики - это API. Если вы хотите вызвать его из настольного приложения, вам нужно написать что-то вроде службы WCF, чтобы облегчить вызов. Было бы достаточно просто вызвать метод WCF GetUser()
, содержащий код return MyBusinessLayer.GetUser()
. Таким образом, API - это бизнес-логика, а WCF / web api и т. Д. - всего лишь кусочки кода, позволяющие внешним приложениям вызывать его.
Таким образом, есть некоторые накладные расходы: вам нужно обернуть свой слой бизнес-логики в разные API в зависимости от того, что вам нужно, и вам нужно будет написать метод API для каждой операции, которую должны выполнять другие приложения, плюс вам потребуется Разобраться способ аутентификации, но по большей части это то же самое. Вставьте свою бизнес-логику в отдельный проект (библиотеку классов), и у вас, вероятно, не возникнет проблем!
Надеюсь, эта интерпретация верна. Спасибо за все обсуждения / комментарии, которые он вызвал.