{"id":988,"date":"2025-04-04T11:15:34","date_gmt":"2025-04-04T11:15:34","guid":{"rendered":"https:\/\/oussamasaidi.com\/?p=988"},"modified":"2025-12-20T11:14:43","modified_gmt":"2025-12-20T11:14:43","slug":"domain-driven-design-clean-architecture-for-dot-net-core","status":"publish","type":"post","link":"https:\/\/oussamasaidi.com\/en\/domain-driven-design-clean-architecture-for-dot-net-core\/","title":{"rendered":".Net 8 Domain Driven Design l&rsquo;Architecture Propre et simple"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>Dans le d\u00e9veloppement d&rsquo;applications .NET Core robustes et maintenables, l&rsquo;adoption d&rsquo;une <strong>architecture propre<\/strong> (Clean Architecture) combin\u00e9e au <strong>Domain Driven Design<\/strong> (DDD) repr\u00e9sente une approche puissante. Ce guide complet vous pr\u00e9sente une impl\u00e9mentation structur\u00e9e, parfaite pour vos projets d&rsquo;entreprise.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dans cet article<\/h2>\n\n\n<ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-pourquoi-choisir-cette-architecture\">Pourquoi Choisir cette Architecture Pour Domain Driven Design ?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-structure-de-la-solution\">Structure de la Solution<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-1-couche-domain-le-coeur-metier\">1. Domain Driven Design Couche Domain : Le C\u0153ur M\u00e9tier<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-structure-recommandee\">Structure Recommand\u00e9e :<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-2-couche-application-orchestration-des-cas-dusage\">2. Domain Driven Design Couche Application : Orchestration des Cas d&#039;Usage<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-organisation-optimale\">Organisation Optimale :<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-3-couche-infrastructure-implementations-techniques\">3. Domain Driven Design Couche Infrastructure : Impl\u00e9mentations Techniques<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-composants-essentiels\">Composants Essentiels :<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-4-couche-webapi-point-dentree-http\">4. Domain Driven Design Couche WebApi : Point d&#039;Entr\u00e9e HTTP<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-structure-type\">Structure Type :<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-flux-des-dependances\">Flux des D\u00e9pendances<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-packages-nuget-recommandes\">Packages NuGet Recommand\u00e9s<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-avantages-pour-votre-projet\">Avantages pour votre Projet<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-conclusion\">Conclusion<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-derniers-articles\">Nos Derniers Articles<\/a><\/li><\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-pourquoi-choisir-cette-architecture\">Pourquoi Choisir cette Architecture Pour <strong>Domain Driven Design<\/strong>  ?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>S\u00e9paration claire des responsabilit\u00e9s<\/strong> : Chaque couche a un r\u00f4le bien d\u00e9fini<\/li>\n\n\n\n<li><strong>Ind\u00e9pendance technologique<\/strong> : Le domaine m\u00e9tier ne d\u00e9pend d&rsquo;aucune technologie sp\u00e9cifique<\/li>\n\n\n\n<li><strong>Testabilit\u00e9 accrue<\/strong> : Isolation des composants pour des tests unitaires efficaces<\/li>\n\n\n\n<li><strong>\u00c9volutivit\u00e9<\/strong> : Adaptation facile aux changements m\u00e9tiers ou techniques<\/li>\n\n\n\n<li><strong>Maintenabilit\u00e9<\/strong> : Code organis\u00e9 pour une longue dur\u00e9e de vie<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-structure-de-la-solution\">Structure de la Solution<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">VotreSolution\/\n\u251c\u2500\u2500 src\/\n\u2502   \u251c\u2500\u2500 VotreSolution.Domain\/         # C\u0153ur m\u00e9tier\n\u2502   \u251c\u2500\u2500 VotreSolution.Application\/    # Logique applicative\n\u2502   \u251c\u2500\u2500 VotreSolution.Infrastructure\/ # Impl\u00e9mentations techniques\n\u2502   \u251c\u2500\u2500 VotreSolution.WebApi\/         # Interface HTTP\n\u2502   \u2514\u2500\u2500 VotreSolution.Tests\/          # Tests automatis\u00e9s<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-1-couche-domain-le-coeur-metier\">1. Domain Driven Design Couche Domain : Le C\u0153ur M\u00e9tier<\/h2>\n\n\n\n<p><strong>Objectif<\/strong> : Contient toute la logique m\u00e9tier sous forme d&rsquo;entit\u00e9s, objets-valeurs, agr\u00e9gats et services de domaine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-structure-recommandee\">Structure Recommand\u00e9e :<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Domain\/\n\u251c\u2500\u2500 Entites\/\n\u2502   \u251c\u2500\u2500 Produit.cs                   # Exemple d'agr\u00e9gat racine\n\u2502   \u2514\u2500\u2500 Commande.cs                  \n\u251c\u2500\u2500 ObjetsValeurs\/\n\u2502   \u251c\u2500\u2500 Adresse.cs\n\u2502   \u2514\u2500\u2500 Montant.cs\n\u251c\u2500\u2500 Evenements\/\n\u2502   \u251c\u2500\u2500 CommandeCreeeEvent.cs\n\u2502   \u2514\u2500\u2500 EvenementMetier.cs          # \u00c9v\u00e9nement de base\n\u251c\u2500\u2500 Exceptions\/\n\u2502   \u2514\u2500\u2500 ExceptionMetier.cs\n\u251c\u2500\u2500 Interfaces\/\n\u2502   \u2514\u2500\u2500 IDepot.cs                  # Interface g\u00e9n\u00e9rique de d\u00e9p\u00f4t\n\u251c\u2500\u2500 Services\/\n\u2502   \u2514\u2500\u2500 IServiceMetier.cs          \n\u2514\u2500\u2500 Specifications\/                 # Mod\u00e8le de sp\u00e9cification\n    \u2514\u2500\u2500 ProduitDisponibleSpec.cs<\/pre>\n\n\n\n<p><strong>Caract\u00e9ristiques Cl\u00e9s<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aucune d\u00e9pendance externe<\/li>\n\n\n\n<li>Pure logique m\u00e9tier<\/li>\n\n\n\n<li>D\u00e9finit les interfaces de persistence<\/li>\n\n\n\n<li>Contient les \u00e9v\u00e9nements m\u00e9tier<\/li>\n<\/ul>\n\n\n\n<p><em>Exemple d&rsquo;entit\u00e9 avec comportement :<\/em><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Produit : Entite, IAggregateRoot\n{\n    public string Nom { get; private set; }\n    public Montant Prix { get; private set; }\n    public int Stock { get; private set; }\n\n    public void MettreAJourStock(int quantite)\n    {\n        if (quantite &amp;lt; 0) \n            throw new ExceptionMetier(\"Le stock ne peut \u00eatre n\u00e9gatif\");\n        \n        Stock = quantite;\n        AjouterEvenement(new StockProduitModifieEvent(this));\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-2-couche-application-orchestration-des-cas-dusage\">2. Domain Driven Design  Couche Application : Orchestration des Cas d&rsquo;Usage<\/h2>\n\n\n\n<p><strong>Objectif<\/strong> : G\u00e8re les flux applicatifs, les DTOs et coordonne les op\u00e9rations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-organisation-optimale\">Organisation Optimale :<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Application\/\n\u251c\u2500\u2500 Commandes\/\n\u2502   \u251c\u2500\u2500 CreerProduitCommande.cs\n\u2502   \u2514\u2500\u2500 CreerProduitHandler.cs\n\u251c\u2500\u2500 Requetes\/\n\u2502   \u251c\u2500\u2500 ObtenirProduitParId.cs\n\u2502   \u2514\u2500\u2500 ObtenirProduitParIdHandler.cs\n\u251c\u2500\u2500 DTOs\/\n\u2502   \u251c\u2500\u2500 ProduitDto.cs\n\u2502   \u2514\u2500\u2500 DetailsProduitDto.cs\n\u251c\u2500\u2500 Interfaces\/\n\u2502   \u251c\u2500\u2500 IEmailService.cs          \n\u2502   \u2514\u2500\u2500 IUtilisateurCourantService.cs\n\u251c\u2500\u2500 Mappings\/\n\u2502   \u2514\u2500\u2500 ProfilAutoMapper.cs\n\u2514\u2500\u2500 Comportements\/\n    \u251c\u2500\u2500 ValidationBehavior.cs     # Pipeline MediatR\n    \u2514\u2500\u2500 LoggingBehavior.cs<\/pre>\n\n\n\n<p><strong>Bonnes Pratiques<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Utilisation du motif CQRS<\/li>\n\n\n\n<li>Gestion des transactions<\/li>\n\n\n\n<li>Validation des requ\u00eates<\/li>\n\n\n\n<li>Mapping DTO\/Entit\u00e9s<\/li>\n<\/ul>\n\n\n\n<p><em>Exemple de gestionnaire de commande :<\/em><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CreerProduitHandler \n    : IRequestHandler&amp;lt;CreerProduitCommande, Resultat&amp;lt;int&amp;gt;&amp;gt;\n{\n    private readonly IDepotProduit _depot;\n    private readonly IMapper _mapper;\n    \n    public CreerProduitHandler(IDepotProduit depot, IMapper mapper)\n    {\n        _depot = depot;\n        _mapper = mapper;\n    }\n\n    public async Task&amp;lt;Resultat&amp;lt;int&amp;gt;&amp;gt; Handle(\n        CreerProduitCommande requete, \n        CancellationToken cancellationToken)\n    {\n        var produit = _mapper.Map&amp;lt;Produit&amp;gt;(requete);\n        \n        await _depot.AjouterAsync(produit);\n        await _depot.UnitOfWork.SauvegarderAsync(cancellationToken);\n        \n        return Resultat&amp;lt;int&amp;gt;.Succes(produit.Id);\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-3-couche-infrastructure-implementations-techniques\">3. Domain Driven Design  Couche Infrastructure : Impl\u00e9mentations Techniques<\/h2>\n\n\n\n<p><strong>Objectif<\/strong> : Fournit les impl\u00e9mentations concr\u00e8tes des interfaces d\u00e9finies dans les couches sup\u00e9rieures.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-composants-essentiels\">Composants Essentiels :<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Infrastructure\/\n\u251c\u2500\u2500 Data\/\n\u2502   \u251c\u2500\u2500 ApplicationDbContext.cs     # Configuration EF Core\n\u2502   \u2514\u2500\u2500 Migrations\/               \n\u251c\u2500\u2500 Depots\/\n\u2502   \u251c\u2500\u2500 DepotProduit.cs          \n\u2502   \u2514\u2500\u2500 DepotGenerique.cs         \n\u251c\u2500\u2500 Services\/\n\u2502   \u251c\u2500\u2500 HorlogeSysteme.cs          # Abstraction du temps\n\u2502   \u2514\u2500\u2500 ServiceEmail.cs          \n\u2514\u2500\u2500 BusEvenements\/\n    \u251c\u2500\u2500 BusEvenementsRabbitMQ.cs  \n    \u2514\u2500\u2500 BusEvenementsMemoire.cs  <\/pre>\n\n\n\n<p><strong>Points Forts<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Impl\u00e9mentation de la persistence<\/li>\n\n\n\n<li>Communication externe<\/li>\n\n\n\n<li>Services techniques<\/li>\n\n\n\n<li>Facilement rempla\u00e7able<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-4-couche-webapi-point-dentree-http\">4. Domain Driven Design  Couche WebApi : Point d&rsquo;Entr\u00e9e HTTP<\/h2>\n\n\n\n<p><strong>Objectif<\/strong> : Exposer les fonctionnalit\u00e9s via une API REST.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-structure-type\">Structure Type :<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">WebApi\/\n\u251c\u2500\u2500 Controllers\/\n\u2502   \u251c\u2500\u2500 ProduitsController.cs\n\u2502   \u2514\u2500\u2500 CommandesController.cs\n\u251c\u2500\u2500 Middleware\/\n\u2502   \u251c\u2500\u2500 GestionErreursMiddleware.cs\n\u2502   \u2514\u2500\u2500 LoggingMiddleware.cs\n\u251c\u2500\u2500 Extensions\/\n\u2502   \u251c\u2500\u2500 ServiceExtensions.cs       # Configuration DI\n\u2502   \u2514\u2500\u2500 SwaggerExtensions.cs\n\u2514\u2500\u2500 Program.cs                    # Configuration initiale<\/pre>\n\n\n\n<p><em>Exemple de contr\u00f4leur API :<\/em><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[ApiController]\n[Route(\"api\/[controller]\")]\npublic class ProduitsController : ControllerBase\n{\n    private readonly IMediateur _mediateur;\n\n    public ProduitsController(IMediateur mediateur)\n    {\n        _mediateur = mediateur;\n    }\n\n    [HttpPost]\n    public async Task&amp;lt;IActionResult&amp;gt; Creer(\n        [FromBody] CreerProduitCommande commande)\n    {\n        var resultat = await _mediateur.Send(commande);\n        return resultat.Match(\n            id =&amp;gt; CreatedAtAction(nameof(ObtenirParId), new { id }, id),\n            erreurs =&amp;gt; Problem(erreurs));\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-flux-des-dependances\">Flux des D\u00e9pendances<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">WebApi \u2192 Application \u2192 Domain\n            \u2191             \u2191\nInfrastructure \u2192\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-packages-nuget-recommandes\">Packages NuGet Recommand\u00e9s<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Domain<\/strong> : Aucun (logique pure)<\/li>\n\n\n\n<li><strong>Application<\/strong> : MediatR, FluentValidation, AutoMapper<\/li>\n\n\n\n<li><strong>Infrastructure<\/strong> : EntityFrameworkCore, Dapper<\/li>\n\n\n\n<li><strong>WebApi<\/strong> : ASP.NET Core, Swashbuckle<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-avantages-pour-votre-projet\">Avantages pour votre Projet<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Adaptabilit\u00e9<\/strong> : Changement de SGBD sans impact sur le m\u00e9tier<\/li>\n\n\n\n<li><strong>Testabilit\u00e9<\/strong> : Mocking facile des d\u00e9pendances<\/li>\n\n\n\n<li><strong>\u00c9volutivit\u00e9<\/strong> : Ajout de fonctionnalit\u00e9s sans risque de r\u00e9gression<\/li>\n\n\n\n<li><strong>S\u00e9curit\u00e9<\/strong> : Isolation des pr\u00e9occupations sensibles<\/li>\n\n\n\n<li><strong>Performance<\/strong> : Optimisation possible par couche<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion\">Conclusion<\/h2>\n\n\n\n<p>Cette architecture propre combin\u00e9e \u00e0 Domain Driven Design offre un cadre solide pour d\u00e9velopper des applications .NET Core maintenables et \u00e9volutives. En s\u00e9parant clairement les pr\u00e9occupations m\u00e9tiers des aspects techniques, vous gagnez en flexibilit\u00e9 et r\u00e9duisez la dette technique.<\/p>\n\n\n\n<p><strong>Prochaine \u00c9tape<\/strong> : Impl\u00e9mentez cette structure dans votre prochain projet et observez la diff\u00e9rence en termes de qualit\u00e9 de code et de productivit\u00e9 !<\/p>\n\n\n\n<p>Ressources suppl\u00e9mentaires : <a href=\"https:\/\/learn.microsoft.com\/fr-fr\/dotnet\/architecture\/microservices\/microservice-ddd-cqrs-patterns\/ddd-oriented-microservice\" target=\"_blank\" rel=\"noopener\" title=\"\">Concevoir un microservice orient\u00e9 DDD<\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"jetpack-video-wrapper\"><iframe title=\"Clean Architecture with ASP.NET Core 8 | .NET Conf 2023\" width=\"900\" height=\"506\" src=\"https:\/\/www.youtube.com\/embed\/yF9SwL0p0Y0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Vous avez des questions sur une partie sp\u00e9cifique de cette architecture ?<\/strong> Partagez-les dans les commentaires !<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"aioseo-derniers-articles\">Nos Derniers Articles<\/h1>\n\n\n<ul class=\"wp-block-latest-posts__list wp-block-latest-posts\"><li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/oussamasaidi.com\/en\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends\/\">React 19 &amp; Vite: Build Fast Frontends for .NET Developers<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/oussamasaidi.com\/en\/https-oussamasaidi-com-restful-api-mastery-best-practices-with-asp-net-core-part-2\/\">RESTful API best practices\u00a0with ASP.NET Core Part 2<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/oussamasaidi.com\/en\/restful-api-mastery-best-practices-with-asp-net-core\/\">RESTful API Best Practices with ASP.NET Core<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/oussamasaidi.com\/en\/net-8-testing-libraries-complete-guide-for-developers\/\">Best .NET 8 Testing Libraries: The Complete Guide for Developers<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/oussamasaidi.com\/en\/securing-sensitive-information-in-net-core\/\">Securing Sensitive Information in .NET Core: A Complete Guide for Developers<\/a><\/li>\n<\/ul>\n\n\n<div class=\"wp-container-6 wp-block-columns alignwide\">\n<div class=\"wp-container-5 wp-elements-e1ba0e3d9d30b7fec5c25e47c471e6ef wp-block-column has-text-color has-background has-link-color\" style=\"background-color:#c0ebf1;color:#000000;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 id=\"patron\" style=\"font-size:40px\"><strong>Vous aimez le contenu&nbsp;?<\/strong><\/h2>\n\n\n\n<p class=\"has-normal-font-size\"><strong>Si vous aimez mes articles, pensez \u00e0 m\u2019acheter quelques caf\u00e9s !<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\">\n\n\n\n<div class=\"wp-container-4 is-horizontal is-content-justification-center wp-block-buttons alignfull\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius\" href=\"https:\/\/www.buymeacoffee.com\/oussamasaiI\" style=\"background-color:#000000\" target=\"_blank\" rel=\"noreferrer noopener\">Achetez-moi un caf\u00e9<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Introduction Dans le d\u00e9veloppement d&rsquo;applications .NET Core robustes et maintenables, l&rsquo;adoption d&rsquo;une architecture propre (Clean Architecture) combin\u00e9e au Domain Driven&#8230; <\/p>\n<div class=\"art-el-more\"><a href=\"https:\/\/oussamasaidi.com\/en\/domain-driven-design-clean-architecture-for-dot-net-core\/\" class=\"art-link art-color-link art-w-chevron\">Read more<\/a><\/div>","protected":false},"author":1,"featured_media":992,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[40,68,45,56,17,84,82,83,98],"tags":[47,48,49,97,93,94,53,50,96],"ppma_author":[286],"class_list":["post-988","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-netcore","category-api","category-asp-net","category-c-2","category-design","category-ef-core","category-entity-framework-core","category-entity-framework-core-2","category-solid","tag-net-core","tag-asp-net","tag-c-sharp","tag-clean-code","tag-ddd","tag-domain-driven-design","tag-dot-net-core","tag-log","tag-solid"],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ddd-net-corepng.png","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1406,"url":"https:\/\/oussamasaidi.com\/en\/net-8-test-driven-design-architecture-7-proven-patterns-to-build-robust-maintainable-systems\/","url_meta":{"origin":988,"position":0},"title":"Net 8 Test Driven Design Architecture 7 Proven Patterns to Build Robust, Maintainable Systems","author":"Saidi Oussama","date":"November 25, 2025","format":false,"excerpt":"Introduction to Test Driven Design \u2014 What this guide covers If you want a battle-tested approach to designing systems that are maintainable, testable, and production-ready, .Net 8 Test Driven Design Architecture combines the stability of .NET 8 with Test Driven Design discipline and modern architecture patterns. This guide gives patterns,\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/dot-net-8-tdd-architecture-article-cover.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/dot-net-8-tdd-architecture-article-cover.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/dot-net-8-tdd-architecture-article-cover.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/dot-net-8-tdd-architecture-article-cover.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/dot-net-8-tdd-architecture-article-cover.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/dot-net-8-tdd-architecture-article-cover.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1086,"url":"https:\/\/oussamasaidi.com\/en\/logging-centralise-avec-opentelemetry-dans-net-core\/","url_meta":{"origin":988,"position":1},"title":"Logging Centralis\u00e9 avec OpenTelemetry dans .NET Core","author":"Saidi Oussama","date":"April 7, 2025","format":false,"excerpt":"Diagramme officiel OpenTelemetry montrant le flux de donn\u00e9es. Source originale. Introduction Dans le monde du d\u00e9veloppement moderne, la gestion des logs est devenue un \u00e9l\u00e9ment critique pour assurer la stabilit\u00e9 et la performance des applications. OpenTelemetry \u00e9merge comme la solution ultime pour impl\u00e9menter une strat\u00e9gie de logging centralis\u00e9e efficace. Ce\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":931,"url":"https:\/\/oussamasaidi.com\/en\/net-9-entity-framework-core-what-is-new\/","url_meta":{"origin":988,"position":2},"title":"Les Nouveaut\u00e9s d&rsquo;Entity Framework Core avec .NET 9 : Ce Qu&rsquo;il Faut Savoir","author":"Saidi Oussama","date":"January 6, 2025","format":false,"excerpt":"La sortie de .NET 9 s\u2019accompagne de mises \u00e0 jour significatives dans Entity Framework Core (EF Core), le c\u00e9l\u00e8bre ORM de Microsoft. Ces nouveaut\u00e9s visent \u00e0 simplifier les sc\u00e9narios complexes et \u00e0 am\u00e9liorer les performances, la compatibilit\u00e9 cloud et l\u2019int\u00e9gration IA. Voici les cinq principales nouveaut\u00e9s qui transformeront vos projets.\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1714,"url":"https:\/\/oussamasaidi.com\/en\/https-oussamasaidi-com-restful-api-mastery-best-practices-with-asp-net-core-part-2\/","url_meta":{"origin":988,"position":3},"title":"RESTful API best practices\u00a0with ASP.NET Core Part 2","author":"Saidi Oussama","date":"December 20, 2025","format":false,"excerpt":"Testing, Performance, Security, Microservices & Deployment Introduction: From Solid Foundations to Production Excellence In Part 1 of RESTful API Mastery, we established the architectural and technical foundations required to build reliable, evolvable RESTful APIs with ASP.NET Core. However, a well-designed API only becomes truly valuable when it is tested, observable,\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"RESTful API Mastery","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":660,"url":"https:\/\/oussamasaidi.com\/en\/best-libraries-for-aspnet-core\/","url_meta":{"origin":988,"position":4},"title":"15 meilleures biblioth\u00e8ques pour les d\u00e9veloppeurs ASP.NET Core","author":"Saidi Oussama","date":"November 23, 2022","format":false,"excerpt":"Plusieurs nouveaux d\u00e9veloppeurs font quotidiennement leurs premiers pas dans ASP.Net Core pour leur carri\u00e8re de d\u00e9veloppement Web. Choisir et ma\u00eetriser les meilleures biblioth\u00e8ques qui aident \u00e0 optimiser l'exp\u00e9rience de d\u00e9veloppement est le facteur d\u00e9cisif pour toute technologie. Avec la croissance rapide de .NET Core au cours des derni\u00e8res ann\u00e9es, plusieurs\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1639,"url":"https:\/\/oussamasaidi.com\/en\/restful-api-mastery-best-practices-with-asp-net-core\/","url_meta":{"origin":988,"position":5},"title":"RESTful API Best Practices with ASP.NET Core","author":"Saidi Oussama","date":"December 16, 2025","format":false,"excerpt":"Professional Best Practices, Versioning Strategies & Advanced Serialization (Part 1) In this blog Introduction: Building Enterprise-Grade RESTful APIs with ASP.NET Core1. RESTful APIs in the Modern ASP.NET Core EcosystemWhy REST Still Dominates2. REST Architectural Constraints Every ASP.NET Core API Must EnforceClient\u2013Server SeparationStatelessnessUniform Interface3. Establishing a Clean and Scalable ASP.NET Core\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"RESTful API Mastery","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"authors":[{"term_id":286,"user_id":1,"is_guest":0,"slug":"oussama_sa","display_name":"Saidi Oussama","avatar_url":{"url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg","url2x":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg"},"author_category":"1","first_name":"Oussama","last_name":"SAIDI","user_url":"https:\/\/oussamasaidi.com","job_title":"Senior Fullstack .NET Developer","description":"I\u2019m a Senior Fullstack .NET Developer specializing in building scalable, high-performance web applications with .NET, C#, and modern frontend frameworks like React.js. I\u2019m passionate about clean architecture, automated testing, and sharing knowledge through blogs and tutorials."}],"_links":{"self":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/comments?post=988"}],"version-history":[{"count":22,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/988\/revisions"}],"predecessor-version":[{"id":1160,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/988\/revisions\/1160"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media\/992"}],"wp:attachment":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media?parent=988"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/categories?post=988"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/tags?post=988"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/ppma_author?post=988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}