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.