2009-05-23 69 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