2009-05-23 123 views
4

我在即将推出的项目中使用工作流引擎的想法。我们知道使用工作流引擎有很多警告,并且我们在很多平台上有很多开发经验,所以我们愿意让工作流引擎的选择优先于我们最喜欢的工具集或开发人员IDE。你推荐哪种工作流程引擎?

我们在内部工作流程不是外部的工作流(即聚集SOAP调用到知道交易的,更高层次SOA)更感兴趣(即Petri网的容易改变ERP的目的不涉及额外的编码时间)。你会推荐哪种工作流引擎?我们已经通过肤浅OracleMicrosoft看着产品,以及一些opensource的东西太多。这一切都非常令人难以置信,所以请仅在您有实际内部工作流程的实际生活经验时做出回应。

回答

5

我已经部署在过去的两个K2和WF系统。 K2非常强大,但花钱很多。 WF是一个失败者,但很快就会有所改善。两者都与.NET堆栈(MOSS具体)很好地集成,并且都具有非常好的工具集成。一旦你理解了工作流模型,两者都相对容易开发。

您可以从许多不同的MS合作伙伴那里获得解决方案支持,尽管我的猜测是WF更容易获得解决方案支持(即更多的合作伙伴拥有比K2更多的WF顾问)。

不幸的是,我没有与Oracle产品或你所提到的开源替代任何经验,所以我不能对这些评论。

如果你是不堪重负,我建议你看看WF Virtual Labs(在页面底部)。他们会让你掌握这项技术,熟练掌握这些技术,并通过几种方案。一旦你有了这些,理解WF如何适应你想要做的事情应该会容易得多。另外,我可以推荐Essential Windows Workflow - 非常好的书。这是一个很好的介绍WF 4.0 from PDC

8

如果你可以使用一个状态机,那么我建议叫StateLess by Nicholas Blumhardt (Autofaq creator)一个开源项目。他的方法避免了运行时引擎持久运行的工作流的问题,因为状态是由诸如字符串或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工作流的多个项目:这可以在状态机的构造函数如下设置。维护是非常低的,没有“设计师”为您生成代码等等。再次,它很简单,而且还有美感。

+1

+1代码示例。 – georgiosd 2012-05-07 19:55:07