Как устроен типичный C# проект (solution)?
Что проверяют
Понимаете ли вы разницу между решением и проектом, как проекты ссылаются друг на друга и где живут зависимости, настройки и тесты. Следом часто просят нарисовать структуру вашего последнего сервиса и объяснить выбор слоёв.
Как отвечать
Решение (.sln, в свежих версиях SDK и Visual Studio ещё и XML-формат .slnx) это просто список проектов для IDE и dotnet build. Собирается не решение, а проекты: каждый .csproj даёт свою сборку. Типичная раскладка сервиса на ASP.NET Core:
src/: проекты приложения, часто слоиDomain,Application,InfrastructureиApi, связанные черезProjectReference. Ссылки идут внутрь,Domainни от кого не зависит;tests/: тестовые проекты на xUnit, NUnit или MSTest, плюс интеграционные наWebApplicationFactory;- SDK-style
.csproj: короткий файл сTargetFramework,Nullableи пакетами черезPackageReference. Исходники перечислять не нужно, они подхватываются по маске; Directory.Build.props: общие свойства для всех проектов ниже по дереву, напримерTreatWarningsAsErrorsи анализаторы;Directory.Packages.props: единые версии пакетов на всё решение;global.json: фиксирует версию SDK, чтобы сборка на CI совпадала с локальной;- конфигурация:
appsettings.jsonплюсappsettings.Development.json, выбор по переменнойASPNETCORE_ENVIRONMENT, секреты для разработки в User Secrets, а не в репозитории.
Конфигурации Debug и Release отличаются оптимизациями и отладочной информацией, результат ложится в bin/ и obj/, которые не коммитят.
Где спотыкаются
Описывают устаревший .NET Framework: packages.config, папку lib со скопированными DLL, огромный .csproj со списком каждого файла. В современном .NET пакеты лежат в глобальном кеше NuGet и описываются в самом проекте.
Путают решение и сборку, говорят «решение компилируется в exe». Решение ничего не компилирует, это контейнер.
Дробят код на десяток проектов без причины. Отдельный проект оправдан границей зависимостей или переиспользованием, а не желанием разложить папки, иначе растут время сборки и путаница в ссылках.