很抱歉,这个问题会有点含糊,因为我不完全确定我在找什么。
基本上,在我的(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;
}
这些只是一些例子,但我希望你能理解。
我真正想的是,我所有的通知规则都应该包含在某种可配置的通知类中,它基本上监视对象的状态变化,并做它需要做的任何事情,因此它就像主应用程序的一个插件,并保持松散耦合。同时,我并不觉得我的基础数据对象应该依赖于通知服务之类的东西,我认为这应该是我的主控制器类的插件。
我真的想不出怎么做到这一点,但我想这肯定是一个常见的问题。有没有一个具体的设计模式,我可以阅读给一些线索?以前有人做过这样的事吗?我对这个问题的思考是否正确?我对所有这些东西都很陌生,但我想用正确的方式思考和编码。