Inversion de contrôle

Au lieu d'avoir une classe qui utilise directement une implémentation concrète, les classes utilisées ont une implémentation (utilisent une interface) et la classe qui utilise est liée à ces interfaces.

Par exemple, PasswordResetHelper peut utiliser les classes concrètes de MonEmailSender et MonLogWriter. Au lieu de ça, c'est le « consommateur » de PasswordResetHelper qui spécifiera quel EmailSender ou quel MonLogWriter utiliser.

public class PasswordResetHelper {
    private IEmailSender _emailSender;
    private ILogWriter _logWriter;
 
    // Constructor
    public PasswordResetHelper(IEmailSender emailSender, ILogWriter logWriter) {
        this._emailSender = emailSender;
        this._logWriter = logWriter;
    }
    // Le reste du code utilise _emailSender et _logWriter
}

Le constructeur demande les instances de IEmailSender et ILogWriter, qui seront gardés pour les utiliser plus tard dans le code.

Dans le monde .NET, on peut utiliser StructureMap à cet effet.