Шаблон проектирования для службы уведомлений по электронной почте, которая отслеживает рабочий процесс / состояние - PullRequest
2 голосов
/ 21 сентября 2010

Извините, этот вопрос будет немного расплывчатым, потому что я не совсем уверен, что я ищу.

В основном в моем (Asp.net MVC) веб-приложении у меня есть некоторыебазовый (кодированный вручную) рабочий процесс, запускаемый различными пользовательскими вводами.

Мне нужно отправлять настраиваемые уведомления по электронной почте, когда происходят определенные события.

Например, в контроллере есть метод обновления состояния,который я мог бы написать примерно так:

public ActionResult UpdateStatus(int id, Status status)
{
    Orders order = _orders.GetById(id);
    order.Status = status;

    if (status = Status.AwaitingApproval)
    {
        SendAwaitingApprovalNotification(_roles.GetApproverForDept(order.Department));
    }

    else if (status = Status.Approved && order.Department = someDept) { ... }

    else if (status = Status.Approved && order.Department = someOtherDept) { ... }

    else if // ... etc
}

Как видите, все это очень быстро запутается.Кроме того, логика для того, когда / какие уведомления отправляются, кодируется в контроллер, что мне не подходит.

Кроме того, существуют различные другие действия, которые могут изменять состояние без специального вызова UpdateStatus метод.например,

public ActionResult ChangeOrderCost(int id, decimal newCost)
{
    Orders order = _orders.GetById(id);
    order.Cost = newCost;
    order.Status = Status.AwaitingCustomerApproval;
}

Это только выдуманные примеры, но я надеюсь, что вы поняли.

Я действительно думаю, что все мои правила уведомлений должны быть в некотором роде самостоятельными.настраиваемого класса уведомлений, который в основном отслеживает изменения состояния моего объекта и делает все, что ему нужно, поэтому он действует как плагин для основного приложения и поддерживает слабую связь.В то же время я не думаю, что мои базовые объекты данных должны зависеть от таких вещей, как службы уведомлений, я думаю, что это должно подключиться к моим основным классам контроллеров.

Я не могудействительно думаю, как этого добиться, но я предполагаю, что это должно быть общей проблемой.Есть ли конкретный шаблон дизайна, на котором я могу прочитать некоторые подсказки?Кто-нибудь делал что-то подобное раньше?Я даже правильно думаю об этой проблеме?Я довольно новичок во всем этом, но пытаюсь думать и кодировать правильно.

1 Ответ

2 голосов
/ 21 сентября 2010

Я бы посоветовал схему цепочки ответственности: http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

По сути, это цепочка, в которой каждый элемент действует / не действует в зависимости от выполненного им условия теста. Эти условия можно сделать настраиваемыми, но это зависит от вашей реализации.

...