2009-12-29 2 views
1

질문이 있지만 질문이 약간 다릅니다.인터페이스/구현에 이벤트 추가

IEmailDispatcher

그것은 다음과 같습니다 :

내가 가지고있는 정적 EmailDispatcher 클래스가 : 약간의 배경으로

public interface IEmailDispatcher 
{ 
    void SendEmail(string[] to, string fromName, string fromAddress, string subject, string body, bool bodyIsHTML, Dictionary<string, byte[]> Attachments); 
} 

나는 인터페이스가 메서드 : SendEmail (string [] to, fromName 문자열, fromAddress 문자열, str 제목, 문자열 본문, bool bodyIsHTML, 사전 첨부 파일);

그런 다음 IoC를 통해 관련 IEmailDispatcher 구현을로드하고 해당 메서드를 호출합니다.

내 응용 프로그램은 단순히 내가 그래서 각 구현 할 수있는 등 ... 예를 OnEmailSent, OnEmailFail를 들어, 이벤트를 추가 할 .........

을 EmailDispatcher.SendEmail를 (호출 할 수 있습니다 더 나은 방법이, 이메일을 보내는의 성공과 실패를 처리하고 적절하게 기록합니다. 나는이 일에 대해 갈 것이라고 어떻게

?

또는? 순간

를, 내가 사용 해요 "BasicEmailDispatch er "은 기본적으로 System.Net 네임 스페이스를 사용하고 MailMessage를 생성하여 전송합니다.

향후

, 나는 ... ... 등보고에 대한 SQL DB 테이블에 추가 그래서 BasicEmailDispatcher

답변

2
public interface IEmailDispatcher 
{ 
    event EventHandler EmailSent; 
    void SendEmail(string[] to, string fromName, string fromAddress, string subject, string body, bool bodyIsHTML, Dictionary<string, byte[]> Attachments); 
} 
에 다르게 OnEmailSent 이벤트를 처리 할 다른 메일을 처리하는 다른 클래스를 생성합니다 자세한 내용은

here.

이 당신이 찾고 있던 해답 보면?

0

은 인터페이스에 이벤트를 추가

public interface IEmailDispatcher 
{ 
    void SendEmail(string[] to, string fromName, string fromAddress, string subject, string body, bool bodyIsHTML, Dictionary<string, byte[]> Attachments); 
    event EmailSentEventHandler EmailSent; 
    event EmailFailedEventHandler EmailFailed; 
} 

그리고 정적 클래스

은, 실제 구현의 이벤트를 구독 할 명시 적 이벤트 접근을 사용

public static class EmailDispatcher 
{ 
    public event EmailSentEventHandler EmailSent 
    { 
     add { _implementation.EmailSent += value; } 
     remove { _implementation.EmailSent -= value; } 
    } 

    public event EmailFailedEventHandler EmailFailed 
    { 
     add { _implementation.EmailFailed += value; } 
     remove { _implementation.EmailFailed -= value; } 
    } 
} 
3

그것은하려고처럼 보인다 정적 클래스에 모든 것을 맞추면 (여기서는 정적 클래스를 사용하여 the template pattern을 구현하는) 어색한 일을 수행하게됩니다. 호출자 (응용 프로그램)가 SendEmail 메서드에 대해서만 알면 인터페이스에 있어야하는 유일한 방법입니다.

그런 경우가 참이면, 당신은 당신의 기본 디스패처 클래스 템플릿 패턴을 구현할 수 있습니다 :

public class EmailDispatcherBase: IEmailDispatcher { 
    // cheating on the arguments here to save space 
    public void SendEmail(object[] args) { 
     try { 
      // basic implementation here 
      this.OnEmailSent(); 
     } 
     catch { 
      this.OnEmailFailed(); 
      throw; 
     } 
    } 
    protected virtual void OnEmailSent() {} 
    protected virtual void OnEmailFailed() {} 
} 

더 복잡한 구현은 각각 BasicEmailDispatcher에서 상속 (따라서 IEmailDispatcher를 구현) 및 하나 또는 둘 모두를 오버라이드 (override) 할을 가상 방법의 성공 또는 실패 동작을 제공합니다 :

public class EmailDispatcherWithLogging: EmailDispatcherBase { 
    protected override OnEmailFailed() { 
     // Write a failure log entry to the database 
    } 
} 
+0

을 내가 구현하는 방법을 잘 모르겠어요 this- 어디 않습니다 내 정적 클래스에 맞는? 발신자의 "진입 점"은 ...? 예를 들어 BasicEmailDispatcher, DummyEmailDispatcher가 있습니다 ... 여전히 IEmailDispatcher를 구현합니까? 또는 BaseEmailDispatcher ... – Alex

+0

또한 각 EmailSent 및 EmailFailed 이벤트가 각 구현에서 달라질 수 있습니다 .... – Alex

+0

죄송합니다 - 귀하의 요구 사항을 다소 오해했습니다! 내 대답을 수정하는 과정에서 나는 그것을 조금 분명히하려고 노력했다. 귀하의 정적 클래스에 관해서는, 그것은 정말로 별개의 문제입니다 - 당신이 해왔 던 것처럼 그것을 계속 사용할 수 있습니다. (비록 싱글 톤과 의존성 주입에 대해 StackOverflow를 읽는 것이 좋습니다!) –

관련 문제