Structure typique du code et du projet
Plus un projet grossit, plus est nécessaire d'avoir de l'ordre une structure solide dans un projet. La raison est fort, simple vous risquez d'introduire des illogismes et ou des incohérences dans votre projet lorsqu'il devra plus gros. Il est vrai que si le but d'un projet est simple d'afficher un «Hello World», il n'est pas nécessaire d'avoir de tel structure, mais les logiciels répondant à des demandes de toute sorte, mettre très vite à l'épreuve une structure mal pensés.
Structure de répertoire
La structure de répertoire d'un projet ASP.NET Core suit généralement une organisation claire et modulaire pour faciliter la gestion du code, la maintenance et le déploiement. À la racine du projet, le répertoire principal contient divers sous-dossiers et fichiers essentiels, tels que global.json pour spécifier la version du .NET SDK utilisée, README.md pour documenter le projet, et .gitignore pour exclure certains fichiers du contrôle de version. Cette structure garantit une meilleure organisation et un repérage rapide des éléments clés du projet.
Les fichiers et répertoires liés aux builds et configurations sont souvent centralisés dans des dossiers spécifiques. Par exemple, .build contient les scripts de construction (build.ps1) et les configurations de déploiement comme azure-pipelines.yml pour Azure DevOps. De plus, .config regroupe les fichiers de configuration locale pour les machines de développement, tandis que artifacts stocke les artefacts générés lors des builds, tels que les binaires ou les journaux. Cette séparation permet de bien distinguer les phases de développement et de déploiement.
Le dossier azure est dédié à l'infrastructure infonuagique et contient des sous-dossiers comme infrastructure pour les scripts de provisionnement et gabarits pour les fichiers ARM/Bicep définissant l'infrastructure Azure. D'autre part, bd regroupe les scripts de construction de la base de données, facilitant ainsi la gestion des migrations et des mises à jour des schémas. Cette organisation est essentielle pour assurer une bonne gouvernance du projet, en particulier lorsqu'il est déployé dans des environnements infonuagique ou hybrides.
La section docs centralise toute la documentation du projet, avec des sous-dossiers pour l'architecture (architecture), l'API (api, pouvant inclure des fichiers Swagger), et les guides d'utilisation (guides). Pour les dépendances externes, le dossier lib contient les bibliothèques non gérées par NuGet, ce qui permet d'éviter des dépendances inutiles dans le code source. Ainsi, la documentation et les dépendances sont bien organisées et facilement accessibles.
Le coeur du projet se trouve dans src, hébergeant le code source de l'application. Ce dossier peut contenir plusieurs sous-projets, comme MyApp.Api pour l'API ASP.NET Core, MonApp.Library pour une bibliothèque réutilisable, et Site pour l'interface utilisateur. Chaque projet suit la structure MVC avec des répertoires Controllers, Models et Views. On y retrouve aussi des fichiers fondamentaux comme Program.cs, servant de point d'entrée, et Startup.cs, configurant l'application (si applicable). Cette organisation modulaire facilite la mise à l'échelle et la réutilisation du code.
Les ressources statiques sont regroupées dans resources, contenant des sous-dossiers pour le CSS (css/site.css), le JavaScript (js/site.js), la localisation (locales), les images (images), et des fichiers de configuration supplémentaires (config). De plus, samples fournit des exemples de code et des preuves de concept (SampleApp), permettant ainsi aux développeurs d'expérimenter avec des implémentations spécifiques sans impacter le projet principal.
Enfin, le dossier tests contient les tests de l'application, avec des sous-dossiers dédiés aux tests unitaires (MyApp.Tests.Unit), aux tests d'intégration (MyApp.Tests.Integration) et aux tests fonctionnels (MyApp.Tests.Functional). De son côté, tools héberge des outils de développement et de migration, y compris des scripts SQL pour les bases de données. Cette séparation des tests et des outils de développement garantit une meilleure qualité du code et simplifie le travail des équipes en charge de la maintenance et du déploiement.
La structure de répertoire typique d'un projet ASP.NET Core bien organisé, incluant des éléments comme la documentation, des API, des pipelines Azure, des scripts, des bibliothèques, des exemples, des tests, des outils, et des ressources, pourrait ressembler à ceci :
Dossier | Description |
---|---|
/MonProjetAspNetCore | Ce répertoire contient le projet |
/.build | Ce répertoire contient des scripts de build et configurations spécifiques |
azure-pipelines.yml | Ce fichier contient la configuration pour Azure Pipelines |
docker-compose.yml | Ce fichier contient la configuration Docker |
build.ps1 | Ce fichier contient le script PowerShell pour automatiser la compilation |
/.config | Ce répertoire contient la configuration locale nécessaire pour installer le projet sur les machines de développement. |
/artifacts | Ce répertoire contient les artifacts générés (builds, paquets, journal de bord,...) |
/azure | Ce répertoire contient les scripts et la configurations Azure |
/infrastructure | Ce répertoire contient les scripts pour déployer l'infrastructure Azure |
/templates | Ce répertoire contient les gabarits ARM/Bicep pour l'infrastructure |
/bd | Ce répertoire contient les scripts de construction de la base de données |
/docs | Ce répertoire contient la documentation du projet |
/architecture | Ce répertoire contient le diagrammes d'architecture |
/api | Ce répertoire contient la documentation API (par exemple Swagger) |
/guides | Ce répertoire contient les guides d'utilisation |
/lib | Ce répertoire contient les bibliothèques externes (si non gérées par NuGet) |
external-library.dll | Ce fichier contient une bibliothèque externe |
/src | Ce répertoire contient le code source de l'application |
/MyApp.Api | Ce répertoire contient le projet ASP.NET Core (API) |
/Controllers | Ce répertoire contient les contrôleurs API |
/Models | Ce répertoire contient les modèles utilisés par l'API |
/Services | Ce répertoire contient les services métier |
appsettings.json | Ce fichier contient la configuration de l'application |
Program.cs | Ce fichier contient le point d'entrée de l'application |
Startup.cs | Ce fichier contient la configuration ASP.NET Core |
MonApp.Api.csproj | Ce fichier contient le projet C# |
/MonApp.Library | Ce répertoire contient la bibliothèque de classes (réutilisable) |
MonApp.Library.csproj | Ce fichier contient le projet de la bibliothèque |
/Site | Ce répertoire contient le projet principal ASP.NET Core |
/Controllers | Ce répertoire contient le contrôleurs du site |
/Models | Ce répertoire contient les modèles utilisés par le site |
/View | Ce répertoire contient les vues utilisés par le site |
/resources | Ce répertoire contient les ressources statiques (images, fichiers,...) |
/css | Ce répertoire contient les feuilles de styles CSS |
site.css | Ce fichier contient les CSS principale du site |
/js | Ce dossier contient les JavaScript |
site.js | Ce fichier contient le code JavaScript principale du site |
/locales | Ce répertoire contient les fichiers de localisation |
/images | Ce répertoire contient les images du projet |
/config | Ce répertoire contient les fichiers de configuration supplémentaires |
/samples | Ce répertoire contient des exemples de code ou d'utilisation de l'application, des Kick-Off, des preuves de concepts,... |
/SampleApp | Ce répertoire contient des exemples avec un petit projet d'application |
SampleApp.csproj | Ce fichier contient les spécifications du projet SampleApp. |
/scripts | Ce répertoire contient les scripts utilitaires (déploiement, build,...) |
deploy.ps1 | Ce répertoire contient le script de déploiement |
/tests | Ce répertoire contient les tests d'applications |
/MyApp.Tests.Unit | Ce répertoire contient les tests unitaires |
/MyApp.Tests.Integration | Ce répertoire contient les tests d'intégration |
/MyApp.Tests.Functional | Ce répertoire contient les tests fonctionnels |
/tools | Ce répertoire contient les scripts et les outils pour le développement et la maintenance |
/migration-scripts | Ce répertoire contient les scripts de migration de base de données |
global.json | Ce fichier contient les spécifications de la version .NET SDK utilisée |
README.md | Ce fichier contient la documentation générale du projet |
.gitignore | Ce fichier contient les informations pour ignorer certains fichiers dans Git |
Environnement
Dans un projet ASP.NET Core, la variable ASPNETCORE_ENVIRONMENT est essentielle pour gérer la configuration en fonction du contexte d'exécution. Cette variable permet de définir si l'application fonctionne en mode Développement, Staging (préproduction) ou Production. Grâce à cette distinction, l'application peut charger des paramètres spécifiques à chaque environnement, comme les fichiers de configuration appsettings.Development.json, appsettings.Staging.json ou appsettings.Production.json. Ce mécanisme garantit que l'application utilise des réglages adaptés à chaque phase de son cycle de vie.
Le fichier de configuration principal, appsettings.json, contient les paramètres de base, mais il est complété par un fichier spécifique selon la valeur de ASPNETCORE_ENVIRONMENT. Par exemple, en mode Développement, le fichier appsettings.Development.json peut activer des journaux détaillés et un serveur de base de données local, tandis qu'en mode Production, appsettings.Production.json désactivera certaines fonctionnalités comme le Swagger et réduira la verbosité des journaux de bord. Cette flexibilité permet aux développeurs d'adapter leur application aux besoins réels de chaque environnement.
Au-delà des fichiers de configuration, ASPNETCORE_ENVIRONMENT influence également le comportement de l'application dans Program.cs ou Startup.cs. Par exemple, une page d'erreur détaillée (UseDeveloperExceptionPage()) peut être activée uniquement en développement, tandis qu'en production, une page d'erreur générique sera affichée. De même, certains services comme Swagger ou les outils de debugging peuvent être activés uniquement en mode Développement pour éviter toute exposition en production.
La définition de ASPNETCORE_ENVIRONMENT peut se faire de plusieurs manières. Elle peut être spécifiée dans le fichier launchSettings.json de Visual Studio, définie comme une variable d'environnement dans le terminal (export ASPNETCORE_ENVIRONMENT=Production sous Linux, ou $env:ASPNETCORE_ENVIRONMENT="Production" sous Windows), ou encore configurée via IIS ou Kestrel. Cette flexibilité permet d'adapter l'environnement d'exécution sans modifier le code source de l'application.
La gestion des environnements via ASPNETCORE_ENVIRONMENT est un atout majeur d'ASP.NET Core. Elle permet d'adapter automatiquement l'application aux besoins de chaque contexte d'exécution, en ajustant les fichiers de configuration, les services activés et les comportements de sécurité. Cette approche améliore à la fois la sécurité, la mise à l'échelle et la maintenabilité des applications, en facilitant la transition entre les différentes phases du développement et du déploiement.
Structure typique des environnements dans un projet ASP.NET Core
Un projet ASP.NET Core est généralement organisé ainsi :
Dossier | Description |
---|---|
/MonProjet | Ce répertoire contient le projet |
appsettings.json | Ce fichier contient la configuration principale de l'application, incluant des paramètres globaux comme les chaînes de connexion, les options de journalisation et d'autres paramètres applicatifs. Il est chargé en premier, quel que soit l'environnement. |
appsettings.Development.json | Ce fichier est une extension de appsettings.json, chargé uniquement lorsque l'environnement est défini sur Développement (ASPNETCORE_ENVIRONMENT=Development). Il contient des paramètres spécifiques comme un niveau de journalisation plus détaillé ou l'utilisation de bases de données locales. |
appsettings.Staging.json | Ce fichier est utilisé lorsque l'application fonctionne en mode Staging (ASPNETCORE_ENVIRONMENT=Staging). Il permet de tester l'application dans un environnement proche de la production, avec des configurations intermédiaires, comme des bases de données de préproduction et des logs modérés. |
appsettings.Production.json | Ce fichier est chargé lorsque l'environnement est défini sur Production (ASPNETCORE_ENVIRONMENT=Production). Il contient des paramètres optimisés pour la performance et la sécurité, comme la désactivation des messages d'erreur détaillés et l'utilisation de bases de données de production. |
Program.cs | Ce fichier est le point d'entrée principal de l'application ASP.NET Core. Il configure l'hôte de l'application et charge la configuration (appsettings.json), les services, les middlewares et les paramètres de l'environnement. À partir d'ASP.NET Core 6, il combine également les responsabilités de Startup.cs dans une approche simplifiée basée sur WebApplicationBuilder. |
Startup.cs | Pour les versions ASP.NET Core < 6. Ce fichier est utilisé pour configurer les services et le pipeline des requêtes HTTP. Il contient généralement deux méthodes : ConfigureServices(IServiceCollection services), qui définit les dépendances à injecter, et Configure(IApplicationBuilder app, IWebHostEnvironment env), configurant les middlewares (comme l'authentification, la gestion des erreurs et les fichiers statiques). Dans ASP.NET Core 6+, son rôle est intégré directement dans Program.cs. |
Properties/ | Ce répertoire contient les propriétés |
launchSettings.json | Ce fichier, situé dans le dossier Properties, est utilisé par Visual Studio et dotnet run pour définir les profils de lancement de l'application. Il spécifie notamment la valeur de ASPNETCORE_ENVIRONMENT, les ports utilisés et le mode d'exécution (IIS Express ou Kestrel). |
Controllers/ | Ce répertoire contient les contrôleurs. |
Models/ | Ce répertoire contient les modèles |
Views/ | Ce répertoire contient les vues si MVC. |
wwwroot/ | Ce répertoire contient la racine du site |
... | ... |
Impact de ASPNETCORE_ENVIRONMENT sur la configuration
- Chargement conditionnel des fichiers de configuration : Dans Program.cs, ASP.NET Core charge la configuration de base (appsettings.json) et ajoute les fichiers spécifiques à l'environnement en fonction de ASPNETCORE_ENVIRONMENT :
- var builder = WebApplication.CreateBuilder(args);
- builder.Configuration
- .SetBasePath(Directory.GetCurrentDirectory())
- .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
- .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true)
- .AddEnvironmentVariables();
- Configuration des journaux de bord en fonction de l'environnement : Le système de journaux de bord peut être configuré différemment selon l'environnement. Par exemple un fichier appsettings.Development.json :
- {
- "Logging": {
- "LogLevel": {
- "Default": "Debug",
- "Microsoft": "Debug",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- }
- }
- {
- "Logging": {
- "LogLevel": {
- "Default": "Warning",
- "Microsoft": "Error",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- }
- }
- Utilisation dans launchSettings.json (Visual Studio) : Dans Visual Studio, launchSettings.json définit ASPNETCORE_ENVIRONMENT pour différents profils :
- "profiles": {
- "IIS Express": {
- "commandName": "IISExpress",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
- "MonProjet": {
- "commandName": "Project",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
- }
- Gestion des services selon l'environnement : ASP.NET Core permet aussi d'activer certains services uniquement pour un environnement donné. Exemple dans Program.cs :
- if (builder.Environment.IsDevelopment())
- {
- builder.Services.AddSwaggerGen(); // Active Swagger uniquement en développement
- }
Si ASPNETCORE_ENVIRONMENT=Development, alors appsettings.Development.json sera chargé en complément de appsettings.json.
Journal de bord réduit pour éviter trop de détails en production (appsettings.Production.json) :
Ainsi, en lançant l'application en mode IIS Express ou depuis Visual Studio, l'environnement sera automatiquement défini sur Development.
Autre exemple dans Startup.cs (ASP.NET Core < 6) :
Définir ASPNETCORE_ENVIRONMENT
- Via une variable d'environnement :
- Via Visual Studio : Modifier launchSettings.json comme vu précédemment.
- Via IIS ou Kestrel :
- Dans IIS, ajouter la variable dans web.config :
- Dans Kestrel, ajouter la variable dans le fichier systemd (Linux) :
Interpréteur de commande | Ligne de commande |
---|---|
Windows (PowerShell) | $env:ASPNETCORE_ENVIRONMENT = "Staging" |
Linux/macOS (Bash) | export ASPNETCORE_ENVIRONMENT=Staging |
<environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" /> </environmentVariables> |
[Service] Environment=ASPNETCORE_ENVIRONMENT=Production |