首先,我不完全确定我理解你的问题,所以让我说出我的假设,然后提供我的答案。必要时适应。
假设:
- 你的业务流程模型操作的集合。例如:A可能是结账步骤,C和C'是两个不同但相似的付款步骤。
- 每个过程步骤在公用数据集的不同部分上运行。例如:B计算总计和折扣(对购物车内容进行操作),C和C'获取总计并启动某种付款。
- 您希望尽可能保持原有实现的完整性。
如果是这种情况,我会确保我对我的数据模型有正确的理解,并且每个步骤的哪些部分可以运行,然后围绕此建立一个状态机。
优点:
- 您的每个过程的步骤可以使用一个或多个国家进行建模。您确保转换基于数据模型。您可以根据用户使用Paypal付款或兑换凭证的决定,决定是否将用户转换到适当的状态来处理此问题。
- 各州可以单独进行测试。单元测试将很容易编写,您可以为面向客户的功能构建线束以进行手动测试(例如与支付提供商进行集成测试)。
- 状态机通常占用空间很小。它们通常是事件驱动的,因此可以在应用程序中保持线程数减少。如果状态只包含逻辑并仅对数据对象进行操作,则甚至可以在不同的并发进程间重复使用状态实例。这取决于你的状态机框架。
事情要记住:
- 在你的状态明确,并有许多小国进行小型专用操作。如果决定使用卡支付或优惠券,则将其设为伪状态。
- 避免上帝对象(即包含知道所有事物的对象)。如果状态开始在大部分域模型上运行,请考虑改进模型或状态机
- 确保使所有事件都是事件驱动的并且是异步的。同步状态机不会扩展。如果您正在调用不是异步的服务,请为其构建一个包装器。
我已经成功地在先前的项目中使用了这种建模业务流程的方法。这是最终用户可以购买物品的流程。我们需要处理大量替代流程,例如在不同的支付方式之间切换,在后端系统不可用时重试等等。
为了满足我们的需求,我们推出了自己的状态机框架。你应该看看你的平台有什么可用的。
感谢您的建议,但我正在使用的应用程序已经5年了,因此我无法选择新技术。 – 2012-07-30 04:04:02
您通常可以将抽象放在系统中的任何边界上。我们最近已经将Windows Workflow与一个应用程序集成在一起,这个应用程序有15年的COM和9年的.NET。 – pointyhat 2012-08-09 16:07:32