У меня есть код, который обновляет список людей по электронной почте. Этот список часто обновляется, и люди добавляются и удаляются до того, как будет вызвана фактическая часть кода «отправить письмо». В настоящее время мой код позаботится об этом:
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);
}
}
Это сложно, и мне это не нравится. Вместо этого я думал о реализации шаблона проектирования Command
. Моя идея, что для создания двух команд:
- SendAllocatedInstructorEmailCommand
- SendDeallocatedInstructorEmailCommand
Когда для курса назначается преподаватель, я добавляю SendAllocatedInstructorEmailCommand
и добавляю его к CommandInvoker.SetCommand
для дальнейшего использования. Аналогично, я бы создал объект SendDeallocatedInstructorEmailCommand
для тех инструкторов, которые прошли курс обучения.
В этом проблема.
Если я создал объект SendAllocatedInstructorEmailCommand
для Instructor A
, а затем вниз по строке Instructor A
освобождается от курса (до сохранения каких-либо данных на странице или отправки электронных писем), то мне нужно удалите SendAllocatedInstructorEmailCommand
, который я построил ранее.
Что такое чистый способ поиска команд, которые уже ссылаются на Instructor A
, чтобы я мог их удалить? Я не могу использовать метод Undo
в своих командах, поскольку электронные письма будут отправлены уже через SendAllocatedInstructorEmailCommand
.
Я думал добавить какой-нибудь Query
метод к моему CommandInvoker
объекту, но я не уверен, что это плохой план.
Должен ли я вообще использовать шаблон проектирования Command
? Это действительно хороший способ поставить в очередь эти письма.
Приветствия.
Иак.