Aller au contenu principal

Infrastructure

Après avoir exploré les couches Domain, Application, il est temps de s’intéresser à la couche la plus… pragmatique : la couche Infrastructure.

C’est ici que vivent les détails techniques : base de données, frameworks, services externes, messagerie, etc. Autrement dit, tout ce qui est nécessaire au fonctionnement du système, mais qui ne doit jamais influencer le métier.


5.1. Qu’est-ce que la couche Infrastructure ?

La couche Infrastructure a un rôle très clair :

  • Fournir des implémentations concrètes aux interfaces définies dans la couche Application
  • Gérer la persistance des données (BDD, fichiers, cache…)
  • Communiquer avec des services externes (API, systèmes tiers, messagerie)
  • Regrouper les composants purement techniques (logging, emailing, monitoring…)

5.1.1. Caractéristiques clés

  • Elle dépend de la couche Application (et parfois indirectement du Domain via les interfaces)
  • Elle contient du code spécifique aux technologies et frameworks
  • Elle est remplaçable sans modifier le cœur métier

👉 L’Infrastructure est au service de l’Application, jamais l’inverse.


5.2. Positionnement dans l’architecture

Pour bien comprendre son rôle, voici son positionnement logique :

Presentation  ──►  Application  ──►  Domain


Infrastructure

À retenir :

  • l’Infrastructure implémente
  • l’Application oriente
  • le Domain décide

5.3. Les composants principaux

La couche Infrastructure est souvent composée de plusieurs types d’adapters.


5.3.1. Les Repositories

Les repositories sont des implémentations concrètes des interfaces définies dans la couche Application.

Par exemple : implémenter IUserRepository avec Entity Framework Core.

using Microsoft.EntityFrameworkCore;

public class UserRepository : IUserRepository
{
private readonly AppDbContext _context;

public UserRepository(AppDbContext context)
{
_context = context;
}

public void Add(User user)
{
_context.Users.Add(user);
_context.SaveChanges();
}

public User? GetByEmail(EmailAddress email)
{
return _context.Users
.FirstOrDefault(u => u.Email.Value == email.Value);
}

public User? GetById(Guid id)
{
return _context.Users.Find(id);
}
}

👉 Points importants :

  • L’interface (IUserRepository) vit en Application
  • L’implémentation (UserRepository) vit en Infrastructure
  • Changer d’ORM ou de base de données n’impacte pas l’Application

5.3.2. Les services externes

La couche Infrastructure est aussi responsable des adaptateurs vers l’extérieur.

Exemple : un service d’envoi d’email.

// Port défini côté Application
public interface IEmailService
{
void SendEmail(string to, string subject, string body);
}

// Implémentation Infrastructure
public class SmtpEmailService : IEmailService
{
public void SendEmail(string to, string subject, string body)
{
// Implémentation SMTP
Console.WriteLine($"Email envoyé à {to} avec le sujet '{subject}'");
}
}

👉 Demain, remplacer SMTP par SendGrid ou AWS SES ne nécessitera aucune modification métier.


5.4. Ce que l’Infrastructure ne doit jamais faire

Pour rester saine, cette couche doit respecter des règles strictes 🚨 :

  • ❌ contenir de la logique métier
  • ❌ prendre des décisions fonctionnelles
  • ❌ exposer des concepts techniques au Domain
  • ❌ définir des règles applicatives

Si de la logique commence à apparaître ici, c’est souvent le signe que :

  • une règle métier est mal placée
  • ou qu’une abstraction manque côté Application

5.5. Bonnes pratiques pour la couche Infrastructure

Quelques principes simples pour éviter les dérives :

  • 🔌 toujours implémenter des interfaces définies en Application
  • 🔄 concevoir des composants facilement remplaçables
  • 🧪 faciliter le mock et le stub en test
  • 📦 regrouper les composants techniques par type (persistence, messaging, external APIs)
  • 🧹 accepter que cette couche change souvent

👉 Une Infrastructure instable n’est pas un problème… tant qu’elle est bien isolée.