Les interfaces en C#
1) Pourquoi utiliser des interfaces ?
Une interface décrit un contrat : elle indique ce qu'une classe doit proposer, sans imposer l'implémentation.
Objectifs :
- réduire le couplage,
- faciliter les tests,
- faciliter l'évolution du code.
2) Syntaxe et principes
public interface IVehiculeRepository
{
List<Vehicule> GetAll();
Vehicule? GetByImmat(string immat);
void Save(Vehicule vehicule);
void Delete(string immat);
}
Une classe implémente ensuite ce contrat :
public class CsvVehiculeRepository : IVehiculeRepository
{
public List<Vehicule> GetAll() => new List<Vehicule>();
public Vehicule? GetByImmat(string immat) => null;
public void Save(Vehicule vehicule) { }
public void Delete(string immat) { }
}
3) Interface vs classe abstraite
- Interface : contrat pur, pas d'état métier.
- Classe abstraite : base partagée avec attributs/propriétés et comportement partiel.
4) Injection de dépendance (constructeur)
public class VehiculeService
{
private readonly IVehiculeRepository _repository;
public VehiculeService(IVehiculeRepository repository)
{
_repository = repository;
}
public List<Vehicule> Lister() => _repository.GetAll();
}
Avec cette approche, on peut remplacer l'implémentation (Csv, Sql, InMemory) sans toucher au service.
5) Mini architecture recommandée
Domain: classes métier.Services: logique applicative.Infrastructure: accès données.
6) Exercices d'application
Exercice 1
Écrire une interface IClientRepository avec 4 méthodes CRUD.
Exercice 2
Implémenter IClientRepository dans une classe InMemoryClientRepository.
Exercice 3
Créer un ClientService injecté avec IClientRepository.
Exercice 4
Remplacer l'implémentation InMemory par une implémentation Csv sans modifier le service.
7) TP guidé (1h)
- Créer
IVehiculeRepository. - Créer
CsvVehiculeRepository. - Créer
InMemoryVehiculeRepository. - Injecter le repository dans
VehiculeService. - Vérifier que le code fonctionne avec les 2 implémentations.
8) Livrable attendu
- Projet compilable.
- Séparation claire
Domain / Services / Infrastructure. - Exemple d'injection fonctionnel.