Je souhaite fournir une implémentation deafult pour un événement généré par une instance de "Authenticator" (ci-après "objAuthenticator").Inscription au gestionnaire d'événements propre à "cet" objet dans la méthode "this"
Est-ce une pratique acceptable pour fournir une telle méthode qui s'enregistre pour gérer le propre événement d'objAuthenticator afin de fournir une implémentation plus transparente?
Et aussi, si c'est une pratique acceptable, j'ai deux questions de suivi. J'ai deux méthodes surchargées pour "SendEmailOnAuthenticationFailed".
- Lequel dois-je exposer au monde extérieur?
Lequel provoquerait moins de couplage entre les classes?
public class Authenticator { public event EventHandler AuthenticationFailed = delegate { }; protected virtual void OnAuthenticationFailed() { var handler = AuthenticationFailed; handler(this, EventArgs.Empty); } public void IsAuthenticated() { // Some logic... // ... // Woops authentication failed OnAuthenticationFailed(); } // Is this a better option? public void SendEmailOnAuthenticationFailed() { SendEmailOnAuthenticationFailed(EmailSender); } // Or is this? public void SendEmailOnAuthenticationFailed(EventHandler emailSender) { AuthenticationFailed += emailSender; } private void EmailSender(object sender, EventArgs e) { Console.WriteLine("Send email: EmailSender"); } }
[UPDATE]: Réponse à la question
Marc Gravell Je suis très confus au sujet de ce que votre code essaie de faire
Jusqu'à présent , "SendEmailOnAuthenticationFailed" n'est pas exposé au monde extérieur. Ce que j'essaie de faire est que (je viens d'ajouter IsAuthenticated) dans "IsAuthenticated", quand une authentification échoue, je voudrais envoyer un email sans avoir à écrire le même gestionnaire d'événement partout.
[MAJ2]: Je me suis rendu compte qu'il n'y a pas besoin d'exposer "AuthenticationFailed". Je vais garder la classe aussi fermée que possible sans exposer l'événement. Pourquoi ne pas marquer plus d'une réponse comme «réponse»? ...
[Update3]: Sortie finale: Voici la façon dont j'ai décidé de mettre en œuvre.
public class Authenticator
{
private readonly IEmailResponder _EmailResponder;
public Authenticator(IEmailResponder emailResponder)
{
_EmailResponder = emailResponder;
}
public void IsAuthenticated()
{
// Some logic...
// ...
// Woops authentication failed
SendEmailForAuthenticationFailure();
}
private void SendEmailForAuthenticationFailure()
{
_EmailResponder.SendEmail(...);
}
}
Non, ils ne peuvent pas faire cela. AuthenticationFailed est un événement - il n'est pas assignable de n'importe où sauf à l'intérieur de la classe (où le même nom fait référence au champ). –
bon appel. Correction de la réponse –
"Si vous choisissez de faire cela, assurez-vous que vous injectez la logique de messagerie" -> oui, j'injecte un objet emailer par le constructeur en fait, ci-dessus le code est juste un code démo que je viens de rassembler en une minute. – Sung