-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

私は送信者のフォーマットを盲目的にするのは貧しい選択だと思います。送信者の1人の制約が文字制限(50文字としましょう、たぶんそれがページャです)の場合はどうでしょうか?送信者はどのような文字をメッセージに含めるべきでしょうか?最初の50?それは、メッセージを伝えるのに理想的ではないかもしれません。私は、メッセージを書式化する責任が、特定のメッセージについて何かを知っている型に属するべきであると感じています。別の例として、送信者の1人がHTMLをサポートしていて、重要な単語を太字にしたいと思うかもしれません。そうするには、メッセージの知識が必要です。 – itsme86

+0

@ itsme86これは私が解決できない問題の1つです。電子メールとSMSの場合は、どちらも別のメッセージが必要です。私はこのシナリオに最も適したパターンでは困難を抱えています。 –

答えて

0

Observer Patternです...私がこれまで持っているものです。希望が役立ちます。

編集: 送信するメッセージを決定するロジックからメッセージの送信を分離することができます。私が話していることのより具体的な例を提供するには、メッセージを送信する必要があるときはいつでもイベントを起動してみてください。次に、各メッセージ送信タイプごとにイベントサブスクライバを追加できます。メッセージをいつ送信する必要があるかを決めるコードは、決して変更する必要はなく、新しいタイプを追加するたびに新しい加入者を追加するだけです。

+0

私はこのアイデアが好きですが、特に、どのメッセージングチャネルがどのメッセージをサポートしているかを把握しようとすると、これらの独立したサブスクライバすべてと混乱する可能性があります。私は、イベントディスパッチシステムを各チャンネルから直接活用するのではなく、抽象通知(例えば、たぶんコードと相関情報など)を働かせて、少なくともある種の集中型の通知ディスパッチャがあるべきだと思います。 – plalx

関連する問題