Ich würde gerne eine Tauber-Implementierung für ein Ereignis von einer Instanz von "Authenticator" (im Folgenden "objAuthenticator") generiert.Registrierung auf "this" -Objekt eigenen Event-Handler innerhalb "dieser" Methode
Ist es eine akzeptable Praxis, eine solche Methode zur Verfügung zu stellen, die sich für die Behandlung von objAuthenticators eigenem Ereignis registriert, um eine taubere Implementierung bereitzustellen?
Und auch, wenn es eine akzeptable Praxis ist, habe ich zwei Follow-up-Fragen. Ich habe zwei überladene Methoden für "SendEmailOnAuthenticationFailed".
- Welchen sollte ich der Außenwelt aussetzen?
Welcher würde weniger Kopplung zwischen Klassen verursachen?
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]: Antwort auf Marc GRA Frage
Ich bin sehr verwirrt darüber, was Ihr Code versucht
Bisher zu tun "SendEmailOnAuthenticationFailed" ist nicht der Außenwelt ausgesetzt. Was ich versuche zu tun ist (ich habe gerade IsAuthenticated hinzugefügt) innerhalb "IsAuthenticated", wenn eine Authentifizierung fehlschlägt, möchte ich eine E-Mail senden, ohne überall den gleichen Event-Handler schreiben zu müssen.
[UPDATE2]: Ich habe erkannt, dass es nicht notwendig ist "AuthenticationFailed" auszusetzen. Ich werde die Klasse so geschlossen wie möglich halten, ohne das Ereignis zu offenbaren.
Warum können wir nicht mehr als eine Antwort als "Antwort" markieren? ...
[UPDATE3]: Endgültige Ausgabe: Hier ist die, wie ich beschlossen, zu implementieren.
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(...);
}
}
Nein, das können sie nicht tun. AuthenticationFailed ist ein Event - es ist nicht von irgendwo aus zuweisbar, außer innerhalb der Klasse (wo sich derselbe Name tatsächlich auf das Feld bezieht). –
guten Ruf. Die Antwort wurde korrigiert. –
"Wenn Sie dies tun, stellen Sie sicher, dass Sie die E-Mail-Logik injizieren" -> ja, ich injiziere ein E-Mail-Objekt durch Konstruktor tatsächlich, über Code ist nur ein Demo-Code ich nur in einer Minute zusammengestellt. – Sung