17

基幹業務アプリケーションのメール モジュールを構築しています。何らかの入力に応答してメールを送信する場合、ユーザーが異なるアイテムを含む複数の連続したメールを受信するのではなく、すべてのアイテムが含まれる 1 つのメールのみを受信するように、メールをグループ化する必要があります。また、メールは、メール通知を作成した入力のタイプに応じて、特定のタイプでグループ化する必要があります。入力のリストがあり、それぞれに特定のグループ化タイプがあります。たとえば、次のようになります。

階層:従業員にはプロセスがあり、リクエストにはアクティビティがあります

アクティビティ 1: 従業員による(したがって、受信者は、このアクティビティ タイプの所有するプロセスのすべての通知を 1 つのメールで受け取ります)

アクティビティ 2: プロセスごと(受信者は、このプロセスおよびこのアクティビティ タイプのすべての要求のすべての通知のグループを取得します)

アクティビティ 3: リクエスト別 (このリクエストのアクティビティはグループ化されます)

アクティビティ 4: アクティビティ別 (各アクティビティは別のメールで送信されます)

このグループ分けは常に変化します。

メールが同時に生成されてグループ化されるようにするには、入力を一度に行う必要があると考えるかもしれません。 そうしないと、システムは他の入力をいつ待機し、いつ別のメールを送信するかをどのように知るのでしょうか?.答えは両方なので、私がやっているのはタイマーを設定して、メール サービスが 5 分ごとに実行されるようにすることです。一部の即時メールは数分遅れる可能性がありますが、それは手頃な価格のトレードオフです。

そこで、この責任の連鎖デザイン パターンを使用することにしました。構造は次のとおりです。

メールのグループ化構造

したがって、各タイプがどうあるべきかを定義する2 つのインターフェイスIGroupingTypeCalculateGrouping()があり、2 つのメソッドがあります: : これがアクティビティのグループ化であるかどうかを決定します。GroupEmailsToSend(): これがグループ化の場合、メール リストを取得します。

インターフェイスIGroupingHandlerは、各グループ化タイプを呼び出すサービス クラスです。IGroupingTypeGetGroupingResult()の具体的な実装で2 つのメソッドを呼び出すだけで、最初に正しいグループ化を取得し、それが見つかったときに を呼び出します。このインターフェイスは、グループ化ごとにチェーン内の次のノードも登録します。CalculateGrouping()GroupEmailsToSend()

グループ化 Enum は、グループ化計算の結果を返すためだけのものです。

そして、EndOfChainSendingGroupingクラスもあります。グループ化が見つからない場合に備えて、すぐにメールを送信します。

基本的に、この構造についてアドバイスが必要です。私はこのパターンに慣れていないので、落とし穴はありますか? 私が改善できることはありますか?またはこれを達成するためのより良い方法はありますか?

前もって感謝します..

4

1 に答える 1

4

チェーンはいい音だと思いますし、ここでは最適だと思います。最終的に、Decoratorパターンを使用して受信者リストをフィルタリングできます。

于 2012-10-03T16:54:13.650 に答える