.NET MVC или SPA + WebAPI?

107 views
Skip to first unread message

Alex A.

unread,
Oct 10, 2017, 2:53:34 AM10/10/17
to dotnetconf
Доброго времени суток!

В последнее время всё чаще возникает вопрос - что выбрать MVC или SPA и WebAPI?
С одной стороны - у нас достаточно много бизнес-логики, которую легче организовывать на стороне сервера, используя языки явной типизации.
С другой стороны - на клиенте часто есть потребность в обновлении данных, добавлении / удалении стандартных блоков, изменении количества закладок или строк в таблицах. Эти операции вполне могут быть воспроизведены с помощью системы привязок (binding) и массивами, например в Angular. Однако, если связываться с Angular, то придётся переписывать всю страницу, отказываясь от уже написанных представлений на MVC, и писать новые представления на Angular. Можно, конечно, использовать Angular только в новых страницах. Тогда все что будут делать контроллеры в MVC - это тупо возвращать представление с Angular, а Angular уже будет обращаться к WebAPI, где и будет исполняться бизнес-логика. Но тогда появиться потребность в организации части бизнес-логики и на клиенте, что может быть не так просто, используя языки неявной типизации, да и теряется однородность архитектуры / подхода к организации кода.
Я, конечно, понимаю, что вопрос достаточно спорный и есть много приверженцев как одного, так и другого способов организации кода. Но меня интересуют все мнения и все "за" и "против", как одного так и другого способов.
Буду рад вашим комментариям и надеюсь они помогут мне понять, где проходит тонкая грань между двумя подходами.

Заранее, благодарен.

Alexander Byndyu

unread,
Oct 10, 2017, 3:20:37 AM10/10/17
to dotne...@googlegroups.com
Добрый день!

У нас в компании front-end четко отделился об бэкенда. Теперь на фронте чисто JavaScript-приложение.

Вот здесь описал подробней http://blog.byndyu.ru/2016/01/javascript-razor-aspnet-mvc.html

Буду рад ответить на вопросы.

--

---
Вы получили это сообщение, поскольку подписаны на группу dotnetconf.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес dotnetconf+unsubscribe@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.

Artur Drobinskiy

unread,
Oct 10, 2017, 3:41:14 AM10/10/17
to dotne...@googlegroups.com
Зависит от проекта.

Есть CRM/Enterprise проекты где бОльшая доля функционала - формочки для заполнения и таблицы для вывода.
В этих случаях делаем на Razor (банальная авто-валидация форм через стандартные атрибуты экономит кучу времени), используем фулл-стэк разработчиков. На страничках, где требуется больший интерактив прикручиваем JS-компоненты на Vue.

Есть проекты с богатой клиентской логикой (условный интернет-банк хороший пример), там, конечно, SPA лучше подходит.

10 октября 2017 г., 13:53 пользователь Alex A. <aagr...@gmail.com> написал:

Alex A.

unread,
Oct 10, 2017, 4:43:07 AM10/10/17
to dotnetconf
Спасибо за ответы.

Александр, как я понял из вашей статьи, вы не очень верите в full-stack разработчиков, точнее в их возможность делать одинаково хорошо работу на сервере и на клиенте.
Я, скорей всего, склонен принять вашу точку зрения. Однако, появляется вопрос, не связанный с темой "MVC или WebAPI", но напрашивающийся после прочтения вашей статьи.
Почему тогда не использовать JavaScript и на сервере тоже, например Node.js? Тогда можно сократить команду на всех C# разработчиков и использовать только сильных разработчиков JavaScript.

Alexander Byndyu

unread,
Oct 10, 2017, 4:50:44 AM10/10/17
to dotne...@googlegroups.com
Дело в том, что на сервере код исполняется сервером, а на клиенте в браузере (плюс, надо думать о CSS и HTML). Хоть и там и там можно писать на JavaScript, но это будет разный код и разные подходы.

Alex A.

unread,
Oct 10, 2017, 5:00:55 AM10/10/17
to dotnetconf
Спасибо за оперативность.

Тогда ещё один вопрос по теме - что выбрать WebAPI или Node.js? При этом допустим, что команда не набрана и проект средней степени сложности.

Заранее благодарен.

Alexander Byndyu

unread,
Oct 10, 2017, 5:38:12 AM10/10/17
to dotne...@googlegroups.com
Описывал критерии выбора в этом разделе http://blog.byndyu.ru/2017/09/it.html?m=1#it-platform-language

--

---
Вы получили это сообщение, поскольку подписаны на группу dotnetconf.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес dotnetconf+...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/d/optout.
--
Best regards,
Alexander Byndyu
CEO at http://byndyusoft.com

Чапаев

unread,
Oct 14, 2017, 12:40:58 PM10/14/17
to dotnetconf
в связке SPA - WebAPI  мне всегда интересно - чем SPA реализовывается?

пр разработке какие задачи и вопросы я выделяю
1. скорость разработки
2. построение релизов билд машиной
3. покрытие модульными тестами
4. выделение  бизнес логики
5. индексация страниц.

мне довелось поработать по проекту с связке AngularJS + MVC. проект считаю неудачным.
п1.  скорость разработки была никакая. основаня причина наверно оттотго что в AngularJS у всех участников было мало опыта. но четно говоря ресуров чтобы ускориться я не вижу - разработка с JS, без серьезных отладчиков, была достаточно медленная
п2. чем строить например angular приложение ? в tfs из коробки этого нет, teamcity из коробки тоже не умеет. teamcity  наверно настроить можно, чтобы он собирал все пакеты angular, но такого специалиста еще поискать надо.
п3. в документацияъ по angular тесты конечно есть. но во первых - на каком framework его выполнять? какой билд машиной? и вопрос из п2 - где брать такого специалиста, который умеет модульные тесты для js   в teamcity запускать?
п4. в случае SPA - бизнес логика то на клиенте или на сервере? как бы все понятно требование, что бизнес логика должна быть одна, чтобы  ее использщовать в приложении, win-web сервисе, в мобильном приложении?
то есть если будет в WebAPI - то это серверная сторона. как она попадет   в JS в SPA?
грубо говоря валидация на сервере и на клиенте - разные вещи.
п5.  если у вас в проекте критична индексация поисковиками - SPA  не нужен. как индексировать весь контент, сгенерированный на клиенте ?

в общем мой вывод по проекту AngularJS + MVC - это дорого.
время разработки увеличивается. даже с учетом если будешь angular знать.
построение релизов - тема лично для меня вообще  мутная. чем собирать пакеты node.js ? где исктаь таких специалистов?
качетво обеспечить тяжело - с модульными тестами сложнее. их хорошо бы использовыать в режиме зеленая-красная полоса. какой есть инструмент, который модульные тесты для js так обрабатывает?
не сильно понятно где будет жить бизнес логика. то есть будет она изначально на сервере - как она попадет на сторону js ?

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


Alexander Byndyu

unread,
Oct 17, 2017, 6:22:32 PM10/17/17
to dotne...@googlegroups.com
Добрый день!

Вопросы и проблемы типовые для бэкендера, но элементарные для фронтендера. Как собирать, как тестировать, где бизнес-логика...

Сейчас не стоит вопрос делать логику на бэкенде или фронте, потому что сложность и требовательность со стороны UX растёт постоянно. Классический бэекендер с небольшим знанием фронта не может реализовать крутые веб-приложения. А пользователи выбирают, к сожалению, не по красоте и удобству архитектуры, а по качеству UI. 

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

У нас в компании проекты делаются всегда в связке фронта и бэка (разные специалисты). При должных навыках и опыте проекты делаются быстро.

--

---
Вы получили это сообщение, поскольку подписаны на группу "dotnetconf".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес dotnetconf+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Alex A.

unread,
Oct 19, 2017, 8:35:17 AM10/19/17
to dotnetconf
Ещё раз спасибо всем за ответы.

@Александр, если я правильно вас понял, то вы переносите бизнес логику на клиента, оставляя "тонкий" сервер, служащий api-прослойкой для обращения к базам данных. Однако, существует предел сложности для слабо-типизированных языков, таких как javascript, перейдя который, становится тяжело поддерживать и развивать проект. ИМХО, у языков с более строгой типизацией предел сложности намного выше, что позволяет, в свою очередь, делать более сложные проекты, прилагая меньше усилий. Вопрос, как определить этот предел?

У нас в проекте вся корпоративная бизнес-логика реализована на стороне сервера на языках C# и C++, клиент отвечает только за представление. Да у нас есть сложные представления, которые сами требуют логику, но это логика представления и ничего более. К сожалению, многие представления (и сложные в том числе) у нас написаны на .net mvc с поддержкой jquery. Это вызывает много перезагрузок страниц, там где это не нужно. По-этому мы пришли к мнению, что представления со сложным ux/ui, легче превратить в spa.

Однако, такое решение меня немного смущает, так как появляется два вида маршрутов: один - это стандартная .net mvc маршрутизация, второй - это spa/angular маршрутизация. Такой вариант прозрачен для пользователей, но не прозрачен для поисковых движков, а значит не вариант :)

С другой стороны у нас нет сильных фронт-эндов в команде, а следовательно, как сказал @Чапаев, проект может затормозиться. Но если дела обстоят таким образом, то и переход на spa + web api не представляется таким уж решением проблемы. Значит вопрос остаётся открытым...

Alexander Byndyu

unread,
Oct 20, 2017, 3:11:00 AM10/20/17
to dotne...@googlegroups.com
Добрый день!

@Александр, если я правильно вас понял, то вы переносите бизнес логику на клиента, оставляя "тонкий" сервер, служащий api-прослойкой для обращения к базам данных.

Не, не так. У каждой части свой набор функциональности. Возьмите, например, приложение Uber. У него на фронте много работы и на бэке. Фронт у приложения — мобильное приложение iOS или Android. Вы же не станете делать силами бэкендеров мобильное приложение под iOS? Я думаю, что нет. А вот когда речь заходит о приложении на JavaScript, то бэкендеры почему-то решают, что у них есть на это способности.

у языков с более строгой типизацией предел сложности намного выше

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

но это логика представления и ничего более

Видимо у вас не публичный продукт с достаточно типовым интерфейсом. Если мы говорим о публичных продуктах, где UX занимает значительную долю в успехе продукта, там фронт разрастается. 

у нас нет сильных фронт-эндов в команде, а следовательно, как сказал @Чапаев, проект может затормозиться

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

Best regards,
Alexander Byndyu
CEO at Byndyusoft
--

---
Вы получили это сообщение, поскольку подписаны на группу dotnetconf.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес dotnetconf+unsubscribe@googlegroups.com.

Denis Kodua

unread,
Oct 20, 2017, 3:33:19 PM10/20/17
to dotnetconf
typescript + angular 2 в помощь  :0)

20 октября 2017 г., 11:10 пользователь Alexander Byndyu <c...@byndyusoft.com> написал:

Чапаев

unread,
Oct 21, 2017, 12:41:50 PM10/21/17
to dotnetconf


четверг, 19 октября 2017 г., 15:35:17 UTC+3 пользователь Alex A. написал:

С другой стороны у нас нет сильных фронт-эндов в команде, а следовательно, как сказал @Чапаев, проект может затормозиться. Но если дела обстоят таким образом, то и переход на spa + web api не представляется таким уж решением проблемы. Значит вопрос остаётся открытым...


я наблюдаю за развитием приложений, которые  давно разрабатываются - в большинстве случаев это Web приложение  - набор страниц с какой то логикой.и требования нарастают так что уже на некоторые страницы возникают весьма сложные манипуляции с dom моделями - что то загрузить асинхронно, выполнить операцию без перезагрузки страницы. 
люди обычно выворачивались через функцию ajax jquery.  но то тупиковый путь честно говоря. я поэтому писал о ReactJS. это не framework  как ангуляр, осваивать будет проще. но асинхронное взаимодействие реализовать позволит. 
то есть на страницах, где вы видите необходимость реализации SPA подхода можно использовать ReactJS, на остальных - mvc подход.
я во всяком случае в таком направлении думаю.
ведь если вы будете делать целиком SPA приложение- омжете просто не справиться

Alex A.

unread,
Nov 12, 2017, 5:55:52 AM11/12/17
to dotnetconf
Спасибо всем за ответы. Будем пробовать различные варианты, благо ситуация позволяет.

С уважением, Саша.

Reply all
Reply to author
Forward
0 new messages