-1

특정 시스템 이벤트를 기반으로 알림을 보내려는 학생 정보를 작성하고 있습니다. 예를 들어, 학생이 늦게 또는 부재 중으로 표시되면 신청서는 사용자 목록 (부모, 학교 관리자 등)에 알립니다. 이 알림은 사용 가능한 모든 방법 (SMS, 이메일)을 사용하여 메시지를 전송합니다. 각 메소드는, 제약에 근거 해 통지를 포맷합니다. 여기 여러 배달 채널이있는 알림 시스템에 가장 적합한 디자인 패턴은 무엇입니까?

알림이 생성됩니다 일부 이벤트의 목록입니다

  • 할당이
  • 학생 되십시오 합격 점수 아래
  • 평균 방울 누락 표시된을 달
  • 에 대한 명예 롤을
  • 완벽한 출석을 얻는다

SMS 및 전자 메일을 사용하여 메시지/알림을 배달하고 싶습니다. 앞으로는 공개/폐쇄 원칙을 위반하지 않고 새로운 전달 방법을 추가하고 싶습니다.

비슷한 질문이 similar question이지만이 시스템을 구현하기위한 디자인 패턴에 대해서는 언급하지 않았습니다. 나는 또한 this question을 조사했지만, 내 문제는 각 발신자 방법이 맞춤 메시지를 보내야한다는 것이다.

새 전달 방법을 추가하고 각 전달 방법의 기능에 따라 알림/메시지의 형식을 지정할 수 있도록이 시스템을 구현하려면 어떻게해야합니까? 이 시나리오에 가장 적합한 디자인 패턴은 무엇입니까? 모든 알림 메커니즘에 대한 메시지를 생성하려면 팩토리 패턴을 사용해야합니까? 여기

나를 위해 마음에 즉시 제공 무엇

public class NotificationEmailMessage 
{ 
    public string ToEmail { get; set; } 
    public string Subject { get; set; } 
    public string Body { get; set; } 
} 

public class NotificationSMSMessage 
{ 
    public string PhoneNumber { get; set; } 
    public string Message { get; set; } 
} 

public interface INotificationSender 
{ 
    void Send(); 
} 

public class NotificationEmailSender : INotificationSender 
{ 
    public void Send() 
    { 
     System.Diagnostics.Debug.Write("Sending Email"); 
    } 
} 

public class NotificationSMSSender : INotificationSender 
{ 
    public void Send() 
    { 
     System.Diagnostics.Debug.Write("Sending SMS"); 
    } 
} 

public class NotificationMultiSender : INotificationSender 
{ 
    public List<INotificationSender> _senders; 

    public NotificationMultiSender() 
    { 
     _senders = new List<INotificationSender>(); 
    } 

    public void Send() 
    { 
     _senders.ForEach(sender => sender.Send()); 
    } 

    public void AddSender(INotificationSender sender) 
    { 

    } 
} 
+1

발신자 형식을 맹목적으로 만드는 것이 좋지 않은 선택이라고 생각합니다. 보낸 사람 중 하나의 제약 조건이 글자 수 제한 인 경우 (50 자 또는 어쩌면 호출기라고합시다!) 보낸 사람은 메시지에 어떤 문자를 포함 시킬지 어떻게 알 수 있습니까? 처음 50? 메시지를 전달하는 데 이상적이지 않을 수 있습니다. 메시지를 포맷하는 책임은 특정 메시지에 대해 알고있는 유형에 속해야한다고 생각합니다. 또 다른 예로, 발신자 중 한 명이 HTML을 지원하고 ** 중요 단어를 굵게 표시하려고합니다. 그렇게하기 위해서는 메시지 지식이 필요합니다. – itsme86

+0

@ itsme86 이것은 해결할 수없는 문제 중 하나입니다. 전자 메일과 SMS의 경우에는 둘 다 다른 메시지가 필요합니다. 나는이 시나리오에 가장 적합한 패턴으로 어려움을 겪고있다. –

답변

0

Observer Pattern입니다 ... 내가 지금까지있는 것입니다. 희망이 도움이됩니다.

편집 : 전송할 메시지를 결정하는 논리와 메시지 전송을 구분할 수 있습니다. 내가 말하는 것에 대해 더 구체적인 예를 제공하려면 메시지를 보내야 할 때마다 이벤트를 실행 해보십시오. 그런 다음 각 메시지 전송 유형에 대한 이벤트 구독자를 추가 할 수 있습니다. 메시지를 보낼시기를 결정하는 코드는 변경하지 않아도되고 새로운 유형을 추가 할 때마다 새 구독자를 추가하기 만하면됩니다.

+0

나는이 아이디어가 마음에 들지만, 특히 어떤 메시징 채널이 어떤 메시지를 지원하는지 알아 내려고 할 때 이러한 독립적 인 가입자 모두가 엉망이 될 수 있습니다. 적어도 각 채널에서 이벤트 디스패치 시스템을 활용하는 대신 추상적 알림 (예 : 코드 및 상관 정보)을 사용하여 최소한 일정한 중앙 집중식 알림 발송자가 있어야한다고 생각합니다. – plalx

관련 문제