Модульная угловая архитектура для максимального повторного использования кода, но все же обеспечивает достаточную гибкость - PullRequest
1 голос
/ 25 марта 2019

Как компания-разработчик, довольно часто для разных проектов требуется (почти) одинаковый код. Потребность в модульной системе становится все более и более требовательной, так что я максимизирую повторное использование кода как на переднем, так и на внутреннем уровнях.

Важно то, что я не хочу сокращать ограничения, а это означает, что клиент почти всегда сможет получить те функции, которые ему нужны. Если эта функция окажется пригодной для повторного использования в других бизнес-случаях, я бы включила ее в один из «основных» модулей, в противном случае мы бы (расширили / переопределили существующие модули и) создали отдельный модуль.

Back-конец

Теперь на бэк-энде я решил это, и, возможно, стоит объяснить это на примере.

Допустим, у вас есть модуль Core , модуль E-Commerce и модуль Marketplace .

  • Для всех модулей потребуется портал / бэк-офис / административная панель.
  • Модуль электронной коммерции должен иметь отдельный веб-проект для интернет-магазина.
  • Модуль Marketplace должен иметь отдельный веб-проект Marketplace.

То, как я решил это в C #, выглядит так:

architecture back-end

Итак, на изображении выше вы можете видеть, что контроллеры в модулях расширяются, переопределяя его. Все логики домена и приложения одинаковы (не показаны): большинство вещей виртуализированы, поэтому я могу переопределить их при необходимости в рамках одного бизнес-проекта. Таким образом, если один бизнес-проект не соответствует требованию с помощью стандартного модуля «Электронная коммерция», он может расширить или создать дополнительные логические элементы / контроллеры для реализации функций.

Итак, для приложения portal я не вижу проблем. Я могу легко лениво загружать (угловые) модули в зависимости от настроек. Это может быть одно веб-приложение для всех бизнес-случаев, которое не требует особого ухода. Таким образом, хотя на нем показаны два отдельных веб-приложения Portal, они получат одинаковый угловой интерфейсный код. Разумеется, они просто будут разделены на разные серверы.

Фронтальный

Но заходя в интернет-магазин и рынок модулей / проектов:

  • Они оба могут иметь совершенно разный дизайн.
  • И то, и другое может использоваться разными предприятиями, каждый из которых имеет свою уникальную систему оформления заказа / поток на рынке.
    • Но загрузка продуктов, отображение позиций на рынке, регистрация / вход в систему и оплата с точки зрения функциональности в основном равны.
  • Некоторые компоненты, созданные в модуле core и используемые на портале, также должны быть в состоянии использоваться в приложении интернет-магазина / торговой площадки.

Итак ... как мне сделать это правильно в angular (7)? То, что я знаю до сих пор и до сих пор работало.

Сходства между бизнес-проектами

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

  2. Некоторые компании могут захотеть показывать компоненты немного по-другому (на портале). Это может быть достигнуто либо наличием специфичных для проекта файлов style.less (скорее всего, в любом случае, необходимых для основных цветов макета), либо "переопределением / заменой" компонента в соответствии с этим ответом .

  3. Несмотря на то, что интернет-магазин и торговая площадка - это совершенно разные компании, они имеют схожие функции, такие как: вход в систему, страница оплаты для выставления счетов, показ деталей счета, загрузка фотографий, выбор времени и выбора страны / языка + локализация.

  4. Иногда требуются дополнительные поля, этого можно достичь с помощью CRM-подобного метода, настроив его в базе данных и загрузив их в представление для отдельных http-вызовов.

Различия между бизнес-проектами

Я вижу различия в нескольких «этапах», от незначительных изменений до больших изменений:

  1. Небольшие изменения в дизайне: Это потребует лишь небольшого изменения общего макета и может быть достигнуто путем изменения стиля, специфичного для компании.Если этого недостаточно или потребуется много кода в основном файле style.less, мы хотели бы заменить файл component.less.Пример: страница входа в систему.
  2. Значительные изменения в дизайне: Функциональность компонента будет такой же, но для компонента потребуется совершенно другой HTML-файл.Пример: страница профиля учетной записи.
  3. Функциональные изменения: HTML-файл и файл поменьше могут фактически совпадать, но в функциональности / поведении компонента требуются незначительные или существенные изменения.Пример: может потребоваться автоматическое сохранение данных, может потребоваться кнопка подтверждения.
  4. Завершить другой компонент: Решено, см. 2. в сходствах.

Остальные вопросы

  1. Как я могу загрузить другой стиль для определенного компонента?Аналогично предоставлению нескольких файлов дизайна для мобильных устройств, планшетов и компьютеров.Но тогда на основе переменной среды?
  2. Как получить полный другой файл .html для той же функциональности компонента?
  3. Возможно, может быть полезно иметь конфигурацию маршрутизации для каждой компании, чтобы легкопереключиться на пользовательский компонент вместо одного из компонентов по умолчанию в одном модуле?
  4. Как бы я структурировал свои папки?Основным способом ASP.NET является создание углового проекта в рамках веб-проекта, но когда я хочу поделиться компонентами между всеми различными веб-проектами, я не вижу, как это будет работать.Я думаю, что я предпочитаю иметь угловой проект в рамках веб-проекта, потому что они довольно хорошо интегрируются друг с другом, также позволит избежать накладных расходов на аутентификацию на основе токенов, если не размещать их отдельно.

Замечание

Один из способов, который я могу придумать, - это создать свои собственные частные пакеты npm, создать модуль «core», модуль «ecommerce» и модуль «marketplace».И затем каждый фактический бизнес-проект импортирует эти пакеты npm.Я думаю, что для готового к работе кода это будет работать, но во время разработки я не уверен, как это будет работать, чтобы мне не приходилось публиковать свой пакет каждый раз, прежде чем я смогу использовать его в другом проекте.Для этого мне все равно придется решить вышеуказанные вопросы: как я могу снова расширить / переопределить модуль после его импорта.Если бы у меня была возможность иметь ng build --watch на них, это было бы хорошо, но я думаю, что это, вероятно, потребует интенсивной конфигурации, когда я хочу автоматизировать это на CI / CD?Также учитывая тот факт, что он должен легко отлаживаться во время тестирования одного проекта.

В основном я ищу лучшие практики.До сих пор было сложно найти решения, поскольку «модули» и «угловые» идут рука об руку, поэтому большинство решений сосредоточены исключительно на отдельных модулях в рамках одного проекта.

У меня есть эскиз архитектуры того, как я буду структурировать угловые модули:

enter image description here

...