ASP.NET MVC 5 Модульная архитектура веб-приложений?
Компания, в которой я работаю в настоящее время, борется с архитектурным решением для нашего диапазона приложений. На данный момент у нас есть несколько приложений, которые имеют общие части (думаю, как календарь). До сих пор мы продолжали копировать код из другого существующего приложения, но в будущем мы хотим превратить наши приложения в более модульный дизайн:
![Our situation]()
Как вы можете видеть на картинке выше, возможно иметь разные версии модулей для каждого приложения.
Мы рассматриваем возможные решения:
- Построение базовой инфраструктуры приложения, в которой мы можем установить
модулей. Мы думаем о таком инструменте, как Nuget, чтобы выполнить это.
- Построение одного приложения, в котором все наши модули включены (= одна база кода), но клиент получает только функциональность, которая активирована для него. Мы рассматриваем некоторые проблемы с версиями здесь.
Любые предложения по этому поводу? Мы не можем быть первой компанией, которая борется с этой проблемой. Все наши приложения - это веб-приложения ASP.NET MVC 4/5, созданные с помощью шаблонов Razor или шаблонов JavaScript (knockout.js). Все наши приложения развернуты на Microsoft Azure, и у нас есть обширные знания о скриптах buildscripts (MSBuild), CI Server...
Ответы
Ответ 1
Отдельный проект/сборка для каждого модуля и доставка его как пакета Nuget - определенно хорошая стратегия.
Преимущество:
- Может поддерживать и выпускать несколько версий. Различные клиенты получают другую версию.
- Установка последней или конкретной версии, поддерживаемой через Nuget. Это помогает во время разработки, когда разработчик App A может ориентироваться на версию 2.0 модуля A, в то время как разработчик App B может настраивать 1.0.
- База с одним источником с отдельными ветвями для каждой версии. Клиент, использующий 1.0, запрашивает изменение, получит код из ветки 1.0 с запросом исправления.
- Каждый модуль может быть выпущен или обновлен независимо.
Задачи:
-
Во время разработки кода отладки сборки, установленной с помощью Nuget. Nuget поддерживает его встроенный. Мы достигли этого в нашем случае (Framework используется несколькими платформами).
-
Изменения кода, необходимые для кода модуля (требуется ошибка или новая функция). Ну, это сложно:
Вариант 1: тот же разработчик просто продвигается вперед и вносит изменения, создает новый пакет и устанавливает новую версию в своем приложении. Получил разрешение на изменение, поскольку это критический код.
Вариант 2: назначенная команда, ответственная за исправление проблемы или запроса изменения в рамочном коде.
Ответ 2
Вы также можете попробовать использовать архитектуру плагина, просто создайте различные модули, которые составляют приложение в качестве плагина, а затем создайте модуль, который необходим для каждого приложения в виде единой базы кода. В этом случае установка компонента для любого конкретного пользователя будет заключаться в добавлении или вытаскивании плагинов. Многие крупные проекты делают вас этой конкретной архитектурой, поскольку она уменьшает количество копий и паст, увеличивает и повторно использует и скорость разработки. Вы можете проверить nopcommerce проект с открытым исходным кодом, чтобы понять, как это делается.