DIP = principe de conception (le D de SOLID).
Il dit :
public class EmailService
{
public void Send(string message)
=> Console.WriteLine("Email envoyé : " + message);
}
public class NotificationManager
{
private readonly EmailService _service = new EmailService(); // dépendance concrète ❌
public void Notify(string msg)
{
_service.Send(msg);
}
}
Problèmes :
public interface INotifier
{
void Send(string message);
}
public class EmailService : INotifier
{
public void Send(string message)
=> Console.WriteLine("Email envoyé : " + message);
}
public class NotificationManager
{
private readonly INotifier _notifier;
public NotificationManager(INotifier notifier)
{
_notifier = notifier; // dépend d'une abstraction ✔
}
public void Notify(string msg)
{
_notifier.Send(msg);
}
}
DI = technique / mécanisme qui permet d’appliquer DIP en injectant les dépendances de l’extérieur.
INotifier notifier = new EmailService();
var manager = new NotificationManager(notifier);
manager.Notify("Hello DI !");
services.AddTransient<INotifier, EmailService>();
services.AddTransient<NotificationManager>();
Utilisation :
var manager = provider.GetRequiredService<NotificationManager>();
manager.Notify("Hello depuis ASP.NET Core !");
DIP impose d’utiliser des abstractions (interfaces). DI permet d’injecter l’implémentation concrète dans ces abstractions.
“Les classes doivent dépendre d’interfaces, pas de classes concrètes.”
“Je fournis ces interfaces automatiquement.”
Ensemble : DIP + DI = code découplé, testable, évolutif.