2010-10-25 11 views
5

Tengo un código que actualiza una lista de personas para enviarlas por correo electrónico. Esta lista se actualiza a menudo, con personas que se agregan y eliminan antes de llamar a la parte real del código. Actualmente mi código para encargarme de esto es algo como esto:Pensando en usar el patrón de diseño de comando

if (instructorEmailType == InstructorEmailType.AddToCourse) 
{ 
    // If instructor not already in the list, then put them in. 
    if (!this.InstructorsToEmail.ContainsKey(courseInstructor)) 
    { 
     this.InstructorsToEmail.Add(courseInstructor, InstructorEmailType.AddToCourse); 
    } 
    else 
    { 
     // If instructor already in the list, and marked for removal, then get rid 
     // of that entry from the list. 
     if (this.InstructorsToEmail[courseInstructor] == InstructorEmailType.RemoveFromCourse) 
     { 
      this.InstructorsToEmail.Remove(courseInstructor); 
     } 
    } 
} 
else 
{ 
    if (this.InstructorsToEmail.ContainsKey(courseInstructor)) 
    { 
     this.InstructorsToEmail.Remove(courseInstructor); 
    } 
    else 
    { 
     this.InstructorsToEmail.Add(courseInstructor, InstructorEmailType.RemoveFromCourse); 
    } 
} 

Es complicado y no me gusta. He estado pensando en implementar el patrón de diseño Command en su lugar. Mi idea de qué crear dos comandos:

  • SendAllocatedInstructorEmailCommand
  • SendDeallocatedInstructorEmailCommand

Cuando un instructor se asigna a un curso, entonces yo nuevo en marcha un SendAllocatedInstructorEmailCommand y añadirlo a CommandInvoker.SetCommand para su uso posterior . Del mismo modo, crearía un objeto SendDeallocatedInstructorEmailCommand para aquellos instructores que son sacados de un curso.

Ese es el problema.

Si he creado un objeto SendAllocatedInstructorEmailCommand para Instructor A y después de la línea Instructor A se desasigna del curso (antes de que los datos de la página se ha guardado, o mensajes de correo electrónico enviado), entonces es necesario eliminar la SendAllocatedInstructorEmailCommand que yo construido antes.

¿Qué es una forma limpia de buscar comandos que ya hacen referencia a Instructor A, para que pueda eliminarlos? No puedo usar un método Undo en mis comandos ya que los correos electrónicos ya se han enviado a través del SendAllocatedInstructorEmailCommand.

Estaba pensando en agregar algún tipo de método Query a mi objeto CommandInvoker, pero no estoy seguro si ese es un plan pobre.

¿Debería utilizar el patrón de diseño Command? Se ve como una muy buena forma de poner en cola estos correos electrónicos.

Saludos. Jas.

+0

No estoy seguro de seguir. ¿Por qué necesita eliminar el 'SendAllocatedInstructorEmailCommand'? ¿Es independiente de consultar a los comandos que ya hacen referencia al 'Instructor A'? –

Respuesta

1

Yo diría que debes mantener tus comandos, solo desacoplarlos de enviar correos electrónicos.

Sus órdenes deben ser como IncludeInstructorEmail y ExcludeInstructorEmail, ambos deberían implementar una interfaz, como esto

public interface ICommandOverEmailsList 
{ 
    void ApplyToList(List<string> emailsList); 
} 

entonces el código en la parte principal sería la siguiente:

List<string> emailsList = new List<string>(); 
foreach(var command in instructorEmailsCommandsQueue) 
{ 
    command.ApplyToList(emailsList); 
} 
SendEmails(emailsList); 

Por supuesto , esto supone que la secuencia de comandos como "Excluir X, Incluir X" dejará la dirección X en la lista. Esto parece ser diferente de la lógica de código original, pero ¿es realmente necesario?