代码之家  ›  专栏  ›  技术社区  ›  fearofawhackplanet

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

  •  2
  • fearofawhackplanet  · 技术社区  · 15 年前

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

    基本上,在我的(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;
    }
    

    这些只是一些例子,但我希望你能理解。

    我真正想的是,我所有的通知规则都应该包含在某种可配置的通知类中,它基本上监视对象的状态变化,并做它需要做的任何事情,因此它就像主应用程序的一个插件,并保持松散耦合。同时,我并不觉得我的基础数据对象应该依赖于通知服务之类的东西,我认为这应该是我的主控制器类的插件。

    我真的想不出怎么做到这一点,但我想这肯定是一个常见的问题。有没有一个具体的设计模式,我可以阅读给一些线索?以前有人做过这样的事吗?我对这个问题的思考是否正确?我对所有这些东西都很陌生,但我想用正确的方式思考和编码。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Aliostad    15 年前

    我建议责任链模式: http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

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

    推荐文章