Как правильно и удобнее всего разрабатывать модульное ПО?

Разрабатываю один решение, состоящее из 25 связанных между собой проектов. Проекты — несколько .exe и 95% библиотек. Все это взаимосвязано и более-менее разнесено по слоям. Решение по мере развития находилось в одном репозитории с двумя origin ветками main, dev и иногда несколькими локальными. Сейчас перестраиваю решение и из 25 проектов будет ~35 и ~30к строк кода суммарно. Все это изначально раскладывал по папочкам насколько это возможно, но уже ощущаю неудобства при работе с таким количеством проектов.

Можете поделиться вашим опытом, как лучше организовать работу с десятками модулей, если работа ведется в одного? Одно из требований — частое изменение части кода любого модуля.

Я погуглил решения данных проблем и нашел 3:
1) Nuget Насколько я понял это самый лучший вариант для .net. Добавил локальный сервер, опубликовал пакет и вручную его скопировал в папку, поменял версию. Да, круто, что в решении не 30 проектов, но каждый раз публиковать, менять версию? Через тот же GitHub видел настраивают CI/CD, но я же могу с 10-го раза исправить что-то и мне теперь 10 раз пушить изменения? А как дебажить такой пакет?

2) SubModule. Очень понравилась эта идея, но насколько понял в ней есть главный недостаток — лавинообразное обновление версий подмодуля, если один зависит от другого, а тот еще от другого. И я не понял, можно ли репозиторий до локальной версии подмодуля, который изначально был добавлен через удаленную.

3) SubTree. Здесь столкнулся с проблемой, что внутри одного subtree был другой. Может я что-то сделал не так. Подробнее написал на SO: https://ru.stackoverflow.com/questions/1543339/%d0...

Структура проекта

Скриншот двухнедельной давности. Решение — клиент-серверное приложение (signalr) и очередная попытка создания луковичной архитектуры, но слои все же протекают. У клиента и у админа есть 4 главных блока (OS, Drive, Network, Hardware)
1) Apps — .exe файлы
2) Core.
Core.Domain — сущности клиента (ef).
Core.Application — базовые модули, совсем базовые сервисы (не связанные с UI) для админа и клиента.
Core.ServerApplication (не самое лучшее название, наверное) — общие модели между сервером и админом.
3) Infrastructure.
Infrastructure.Common — базовые сервисы, стили, хелперы, сервисы, но уже на уровне WPF. Использует и клиент и админ.
Infrastructure.Admin/Client — базовые вещи как в Common, но для модулей(далее) админа/клиента.
Infrastructure.Hardware/Network/OS — вынесение общих view, конвертеров между клиентом и админом.
4) Modules - Prism модули
Modules.Admin/Client — главные окна, инициализация приложения зависит от Modules.Admin(Client).Common.
Modules.OS/Drive/Network/Hardware — сервисы, view специфичные для админа/клиента

Проекты Admin/Client максимально пустые и состоят из нескольких файлов. Они добавляют все prism-модули и отдают инициализацию в Modules.Admin или Modules.Client.
K4jcBjR.png


P.S.
Сейчас решение большое и есть небольшой дискомфорт, но я могу перемещаться между проектами и изменять их.
  • Вопрос задан
  • 451 просмотр
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
25 проектов в решении - это вполне нормальное количество и ничего особенного с этим делать не нужно. (Видел решения, где их под сотню).
Хотя не исключаю вариант, что на самом деле такое разделение излишнее.

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

Лучше попробуй конкретизировать, как именно проявляется неудобство - тогда и будет вариант решения.
Подумай, почему у тебя вообще столько проектов?
Можно ли их объединить? Если нельзя, то почему ты так думаешь?

PS: из текстового описания вообще не понятно, что такое "слои" и почему между ними нужно как-то перемещаться. Попробуй добавить в вопрос пример иерархии папок из твоего репозитория.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы