2012-09-27 70 views
14

Estoy construyendo el módulo de correo para una aplicación de línea de negocios. La situación es que cuando se envían los correos en respuesta a alguna entrada, se deben agrupar para que el usuario no reciba varios correos consecutivos con diferentes artículos, sino solo uno con todos los artículos incluidos. Además, los correos deben agruparse por un tipo específico, que depende del tipo de entrada que creó la notificación por correo, tengo la lista de entradas y cada uno con su tipo de agrupación específico, por ejemplo:¿Cuáles son las alternativas al patrón de diseño de Cadena de responsabilidad?

Jerarquía: empleado tiene procesos tiene solicitudes ha Actividades

actividad 1:Por empleado (por lo que un receptor recibirá todas las notificaciones de los procesos que posee este tipo de actividad en un solo mai l)

Actividad 2:por el proceso de (un receptor obtendrá un grupo de todas las notificaciones de todas las solicitudes en este proceso, y este tipo de actividad)

Actividad 3:Por Solicitud (se agruparán actividades de esta solicitud)

actividad 4:Por actividad (cada actividad serán enviados en un correo separado)

Estas agrupaciones cambian constantemente.

Puede pensar, bien para hacer que las entradas se deben hacer de una vez para que los correos se generen al mismo tiempo y así se agrupen; de lo contrario, el sistema sabrá cuándo esperar otras entradas y cuándo enviar una ¿correo separado? ... bueno, la respuesta es ambas cosas, entonces lo que estoy haciendo es establecer un temporizador para que el servicio de correo se ejecute cada 5 minutos, algunos correos inmediatos pueden retrasarse unos minutos, pero eso es una compensación asequible.

, así que elegimos para utilizar este Chain of Responsability Design Pattern y aquí está la estructura:

Así que tienen dos interfaces IGroupingType que define cómo cada tipo debe ser, y tiene 2 métodos: CalculateGrouping(): determina si esta es la agrupación de la actividad. GroupEmailsToSend(): si esta es la agrupación, obtiene la lista de correos.

interfaz IGroupingHandler es la clase de servicio que va a llamar a cada tipo de agrupación, la GetGroupingResult() sólo llama a los 2 métodos en los IGroupingType implemetations concretas, primero CalculateGrouping() para obtener la agrupación correcta, cuando la encuentra, llama a la GroupEmailsToSend() . Esta interfaz también registra el siguiente nodo en la cadena para cada agrupación.

La agrupación Enum es solo para devolver el resultado de los cálculos de agrupación.

Y luego está también la clase EndOfChainSendingGrouping, en caso de que no se encuentre una agrupación, solo enviaré el correo de inmediato.

Básicamente solo necesito algunos consejos sobre esta estructura, ya que soy un poco nuevo en este patrón, ¿tiene algún inconveniente? ¿hay algo que pueda mejorar? o hay una mejor manera de lograr esto?

Gracias de antemano ..

+2

Creo que [codereview.se] podría ser un lugar mejor para esto ... –

+0

No conocía ese sitio ... gracias –

Respuesta

2

creo encadenamiento suena bien y parece ser el mejor ajuste aquí. Finalmente, el patrón Decorator se podría usar para filtrar las listas de receptores.

+0

Muchas gracias por visitarnos, seguramente tomaré en consideración sus consejos ...^_ ^ –

Cuestiones relacionadas