我有一位客户对在Web 驱动的应用程序中使用Windows Workflow Foundation (WF) 技术感兴趣。我是 .NET 开发人员,但我对 WF 或 SharePoint 工作流都没有经验。客户想要做的大部分事情似乎都是直截了当的,只是他们希望最终用户能够创建/编辑他们自己的自定义工作流程。在我对 WF 的简短研究中,这似乎不是通常的事情。允许用户自己创建工作流是否可行,或者这真的应该是一个自定义的 ASP.NET MVC 应用程序,或者可能是一个 SharePoint 应用程序?
3 回答
让用户能够更改工作流程应该是 WF 的强项之一。然而,使用 WF 3,整个模型非常适合代码生成而不是标记,因此很难做到。并非不可能,因为您可以使用纯标记工作流程,但这很难。
使用 WF 4,故事应该会更好,因为所有工作流程都是纯标记,根本不涉及任何代码。所有代码都在预定义的活动中,这些活动被编译,用户可以根据需要更改工作流程。此外,WF 设计器更容易在您自己的应用程序中重新托管。
PS SharePoint 工作流是 WF 3 工作流,即使在新的 SharePoint 版本中也是如此,而 WF 4 是一个完全不共享任何代码的全新产品。
您可能想要构建一个可以接受来自用户的触发器的状态机。Nicholas Blumhardt 有一个非常棒的轻量级状态机实现,称为stateless。您可以使用简单的语句创建状态机:
var stateMachine = new StateMachine<TState, TTrigger>();
从项目现场:
var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
phoneCall.Configure(State.OffHook)
.Permit(Trigger.CallDialed, State.Ringing);
phoneCall.Configure(State.Ringing)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.CallConnected, State.Connected);
phoneCall.Configure(State.Connected)
.OnEntry(() => StartCallTimer())
.OnExit(() => StopCallTimer())
.Permit(Trigger.LeftMessage, State.OffHook)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.PlacedOnHold, State.OnHold);
// ...
phoneCall.Fire(Trigger.CallDialled);
Assert.AreEqual(State.Ringing, phoneCall.State);
如您所见,代码非常简单。您可以通过一个项目完成所有您需要的事情。
由于 State 和 Trigger 可以是任何类型,因此您可以从数据库(可能是 Step 表)提供状态机,并允许 Approve=1、Reject=2 的触发器。您可以提前与用户一起创建一系列步骤,并允许他们通过呈现一个步骤来选择触发器,然后允许他们根据他们选择的触发器分配下一步。
在使用 WF(包括 4.0 在内的任何版本)之前,我会仔细检查的是向后兼容性/版本控制,特别是如果您将有长时间运行的工作流程。
一旦您拥有“正在运行”的工作流实例,就很难对组件(代码活动)进行更改。我见过几种版本控制方法来解决这个问题,但您可能会发现这两种方法在现实中都不实用。