.net 监视工作流/状态的电子邮件通知服务的设计模式

.net 监视工作流/状态的电子邮件通知服务的设计模式,.net,design-patterns,oop,service,notifications,.net,Design Patterns,Oop,Service,Notifications,很抱歉,这个问题会有点模糊,因为我不完全确定我在寻找什么 基本上,在我的(Asp.net MVC)web应用程序中,我有一些由各种用户输入触发的基本(手动编码)工作流 当某些事件发生时,我需要发送电子邮件通知 例如,我的控制器中有一个更新状态方法,我可以这样写: public ActionResult UpdateStatus(int id, Status status) { Orders order = _orders.GetById(id); order.Status = s

很抱歉,这个问题会有点模糊,因为我不完全确定我在寻找什么

基本上,在我的(Asp.net MVC)web应用程序中,我有一些由各种用户输入触发的基本(手动编码)工作流

当某些事件发生时,我需要发送电子邮件通知

例如,我的控制器中有一个更新状态方法,我可以这样写:

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;
}
这些只是虚构的例子,但我希望你能理解

我真正想的是,我的所有通知规则都应该在某种可配置的通知类中自包含,该类基本上监视对象上的状态更改,并执行它需要执行的任何操作,因此它就像主应用程序的插件一样,并保持松耦合。同时,我并不觉得我的底层数据对象应该依赖于NotificationServices之类的东西,我认为这应该是我的主控制器类的插件


我真的不知道如何实现这一点,但我猜这一定是一个常见的问题。有没有一个具体的设计模式可以让我读一下,给我一些线索?以前有人做过这样的事吗?我对这个问题的思考是否正确?我对所有这些东西都很陌生,但我试图以正确的方式思考和编码。

我建议采用责任链模式:

它基本上是一个链,其中每个元素根据其实现的测试条件进行动作/不动作。这些条件可以配置,但取决于您的实现