如果您可以使用状态机,那么我建议Nicholas Blumhardt(Autofaq创建者)使用名为StateLess的开源项目.他的方法避免了运行时引擎持有的长时间运行工作流的问题,因为状态是由一个简单的变量(如字符串或int)定义的.
这是一个示例状态机:
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);
您的状态可以是一个整数,允许您从数据库中提供当前状态.这可以在状态机的构造函数上设置如下:
var stateMachine = new StateMachine<State, Trigger>(
    () => myState.Value,
    s => myState.Value = s);
与运行Windows Workflow所需的多个项目相比,您只需在一个程序集中实现此功能.维护非常低,没有"设计师"为您生成代码等.再次,它很简单,并且有美丽.
我过去曾部署过K2和WF系统.K2非常强大,但很有吸引力.WF是一个弱者,但很快就会改善.两者都很好地集成了.NET堆栈(特别是MOSS),并且都具有非常好的工具集成.一旦了解了工作流模型,两者都相对容易开发.
您可以从许多不同的MS合作伙伴那里获得解决方案支持,虽然我的猜测是WF更容易获得解决方案支持(即更多的合作伙伴有更多的顾问知道WF而不是K2).
不幸的是,我对Oracle产品或您提到的开源替代品没有任何经验,因此我无法评论这些.
如果您不堪重负,我建议您查看WF虚拟实验室(页面底部).它们将让您掌握技术,使语言失效,经历几个场景.一旦掌握了这一点,了解WF如何适应您想要做的事情应该会更加容易.另外,我可以推荐Essential Windows Workflow - 非常好的书.这是PDC的WF 4.0的一个很好的介绍.
| 归档时间: | 
 | 
| 查看次数: | 6752 次 | 
| 最近记录: |