Архитектура относительно контроллера MVC против отдельного веб-API, сколько проектов? - PullRequest
2 голосов
/ 15 мая 2019

Раньше я всегда думал о предоставлении методов, которые будут использоваться на стороне клиента в отдельном проекте Web API.В настоящее время я углубляюсь в ASP.NET Core MVC и теперь понимаю, для чего нужны контроллеры.(Я пришел из фона веб-форм ASP.Net)

Учитывая, что в будущем я могу запрограммировать приложение (например, с помощью Xamarin), где я буду использовать большинство тех же методов из проекта Core MVC, это будетимеет смысл разделить большую часть функциональности на отдельный проект веб-API api.xxx.com.

С моей точки зрения, контроллеры ASP.NET Core MVC очень похожи на проекты веб-API, и я не вижубольшая разница с точки зрения их потребления.По сути, я не понимаю, есть ли два проекта (проект Core MVC и отдельный проект веб-API) или только один.

  1. Должен ли я использовать два проекта или только один?Какие преимущества и недостатки?Если я использую два, на основании каких критериев я решу, куда добавить новый код?Могу ли я переместить практически любой (что является исключением) код из контроллеров в проекте Core MVC в проект Web API?Это хороший подход или плохой?
  2. Как мне обращаться с логином на стороне клиента?Я знаю, что могу получить аутентификацию на основе токенов с помощью OWIN для своего проекта Web API, но как мне объединить аутентификацию из проекта ASP.NET Core MVC с проектом Web API?
  3. Давайте предположим, что я решилпросто используйте один проект для обоих.Сколько накладных расходов, если приложение Xamarin будет постоянно вызывать проект MVC вместо проекта Web API?

Ответы [ 3 ]

4 голосов
/ 15 мая 2019

В вашем вопросе есть что распаковать. Сначала к вашему общему запросу:

С моей точки зрения, контроллеры ASP.NET Core MVC очень похожи на проекты Web API, и я не вижу большой разницы с точки зрения их использования. По сути, я не совсем понимаю, есть ли два проекта (проект Core MVC и отдельный проект Web API) или только один.

Это потому, что функционально нет никакой разницы. В ASP.NET Core контроллеры являются контроллерами. Обозначения MVC / Web Api просто о стиле . В первом случае вы будете возвращать представления, а во втором - что-то вроде JSON.

По правде говоря, в более поздних версиях ASP.NET Core стили немного расходятся. Контроллеры API теперь обычно наследуются от ControllerBase, а не Controller, и к ним применяется атрибут [ApiController]. Однако даже это не реальная разница. Атрибут просто добавляет немного сахара, который немного упрощает создание API: автоматический возврат 400, когда ModelState недопустим, переключение привязки по умолчанию с FromForm на FromBody и т. Д. Это все, что вы могли бы с MVC точно так же. Использование ControllerBase просто исключает материал, включенный в Controller, который не нужен для API. Нет способа View для возврата, потому что вы не будете возвращать представления из API, например. Все остальное работает так же.

Короче говоря, о том, как вы реализуете контроллер, а не о каком-либо конкретном выборе использования MVC или Web Api.

Теперь, что касается ваших конкретных вопросов:

  1. Должен ли я использовать два проекта или только один? Какие преимущества и недостатки? Если я использую два, на основании каких критериев я решу, куда добавить новый код? Могу ли я переместить практически любой (что является исключением) код из контроллеров в проекте Core MVC в проект Web API? Это хороший подход или плохой?

Опять же, много здесь, чтобы распаковать. Просто нет правильного ответа, и, честно говоря, вам не нужно решать прямо сейчас. Вы можете начать с одного проекта, смешивая и сопоставляя контроллеры MVC и Web Api. Затем, если вы обнаружите конкретную потребность, вы всегда можете создать новый проект и перенести туда свои контроллеры Web Api. Это зависит только от ваших требований и потребностей ваших приложений, с которыми, к сожалению, никто не может говорить, кроме вас. Мой лучший совет всегда должен начинаться с малого. Выйди из сорняков и просто построй что-нибудь. Вы не вырезаете из камня; что-нибудь может быть изменено позже.

  1. Как мне обработать логин на стороне клиента? Я знаю, что могу получить аутентификацию на основе токенов с OWIN для своего проекта Web API, но как мне объединить аутентификацию из проекта ASP.NET Core MVC с проектом Web API?

Как только вы начнете говорить о проверке подлинности нескольких приложений, вам действительно нужно начать искать решение для централизованной идентификации. Из коробки есть готовые решения с низкой конфигурацией, такие как Azure AD или Auth0, или вы можете использовать свои собственные с Identity Server. Это в основном сводится к тому, что вы готовы заплатить и насколько вы хотите быть вовлечены.

  1. Давайте предположим, что я решил использовать один проект для обоих. Сколько накладных расходов, если приложение Xamarin будет постоянно вызывать проект MVC вместо проекта Web API?

Я не думаю, что вы смотрите на это правильно. Запросы - это запросы, а вопрос лишь масштабный. Разница между одним приложением (одним проектом) и множеством заключается в том, идут ли все запросы в одно место или во многие. Однако вы всегда можете масштабировать как по вертикали (ресурсы), так и по горизонтали (больше экземпляров) даже одно приложение. Таким образом, производительность здесь не является проблемой. В любой форме вы масштабируете, просто по-разному.

1 голос
/ 15 мая 2019

Как уже упоминал Crish, начните с малого в одном проекте, и в конце концов вы сможете что-то изменить. Позже вы можете решить иметь несколько проектов. Это хорошее начало, однако оно смешивает все - весь ваш пользовательский интерфейс (cshtml или угловой или любой другой, какой вы хотите иметь), все ваши контракты данных, API, контроллеры и все остальное.

Почему у нас есть технологии MVC и Web Api?

Это большой вопрос, и у вас есть ответ на этот вопрос: Разделение интересов . Это ключ к разработке архитектуры приложения. Идея состоит в том, чтобы избежать совместного размещения различных проблем в дизайне или коде. Например: у вас есть контроллеры MVC, которые возвращают представления, и у вас есть другой контроллер API, который возвращает только данные. Если вы смешаете эти вещи вместе, я думаю, что это нарушение этого правила. При проектировании архитектуры разделение интересов является ключевым компонентом многоуровневых приложений Building .

Разделение всей логики между различными уровнями позволит ЛЮБОЙ функциональности быть добавленной / удаленной позже и даже позволит вам поддерживать других сторонних потребителей. Если все эти абстракции правильно сгруппированы, вы получите хорошую архитектуру, которая будет наилучшей с любой точки зрения.

Я предлагаю использовать шаблон DDD с принципом SoC. НО, все эти усилия имеют смысл, если у вас есть большое приложение, которое вам нужно расширить с течением времени. Я бы начал документировать все модули, которые у вас могут быть. Если бы я следовал вышеизложенному шаблону и принципу, у меня был бы индивидуальный проект api.xxxmodule для всех модулей - шаблон DDD. У меня будет отдельный MVC, проект API аутентификации / авторизации.

Если вы будете следовать этим двум принципам, ваше приложение будет иметь отдельный модуль для всего - каждый модуль действует как отдельное приложение!

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

1 голос
/ 15 мая 2019

Это зависит от сложности, к которой вы стремитесь. На мой взгляд, ясный путь самый лучший. С ASP.NET Core, использующим концепции и шаблоны проектирования на основе доменов , это хороший путь. Проверьте Чистая архитектура от Стива Смита и попробуйте.

пример того, как вы можете это организовать. enter image description here

...