Windows Workflow动态,用户创建的工作流程

时间:2009-10-20 02:51:53

标签: .net-3.5 workflow-foundation workflow-foundation-4

我有一位客户有兴趣在网络驱动的应用程序中使用Windows Workflow Foundation(WF)技术。我是.NET开发人员,但我没有使用WF或SharePoint工作流程的经验。客户想要做的大多数事情似乎都是直截了当的,除了他们希望最终用户能够创建/编辑他们自己的自定义工作流程。在我对WF的简短研究中,通常情况并非如此。允许用户自己创建工作流是否可行,或者这应该是自定义的ASP.NET MVC应用程序,还是SharePoint应用程序?

3 个答案:

答案 0 :(得分:4)

让用户能够改变工作流程应该是WF的重点之一。然而,对于WF 3,整个模型非常适合代码生成而不是标记,因此很难做到。并非不可能,因为您可以使用纯标记工作流程,但这很难。

使用WF 4,故事应该会好得多,因为所有工作流程都是纯粹的标记,并且根本不涉及任何代码。所有代码都在预定义的活动中,这些活动是经过编译的,用户可以根据需要更改工作流程。此外,WF设计器更容易在您自己的应用程序中重新托管。

PS SharePoint工作流程是WF 3工作流程,即使在新的SharePoint版本中也是如此,WF 4是一个全新的产品,不会共享任何代码。

答案 1 :(得分:2)

您可能想要建立一个可以接受来自用户的触发器的状态机。 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的触发器。您可以提前与用户创建一系列步骤,并允许他们通过显示步骤来选择触发器,然后允许他们根据他们选择的触发器分配下一步。

答案 2 :(得分:1)

在使用WF(任何版本,包括4.0)之前,我要小心检查的是向后兼容性/版本控制,特别是如果您将有长时间运行的工作流程。

在“飞行中”工作流实例后,对组件(代码活动)进行更改可能很困难。我已经看到有两种版本控制方法可以解决这个问题,但你可能发现实际上它们都不实用。