流程流转相关业务与流转的分离
這是我目前正在進行的工作,記錄下來順便理理思路
背景:
我于今年入職這家公司,由于歷史等原因,公司內部軟件系統處于沒有軟件架構的狀態,同時待開發的功能較多,其中工作流審批部分使用的引擎是一個叫Captaris的完全找不到任何資料,且其開發者疑似倒閉,使用它的原因是因為集團在使用,而開發時沒有設計人員,所以程序員沒細想就用了,同時由于沒有任何資料,這個工作流引擎用的面目全非沒有給開發帶來任何好處,并且無法完成有些特殊需求。
針對這種情況,當時決定將這種開發方式廢棄,短時間內封裝一個可以完成支持當時審批需求的單據流轉功能,當時用了5天(非常簡陋),但至少開發效率提高了不止一倍;但是,原本運行著的流程要一點一點的平穩移動過來,同時有些技術以外的原因,原來的個別流程不會移植,面對這種情況,我采用了依賴注入的方式,把原來的工作流封裝了下和我新做的這個借助配置文件在不同的流程采取不同的注入模塊,讓流程外部完全不關心流程內部的實現情況,方面以后會遇到的各種變動。
?
下面進入正題:
? 來了不能拒絕的需求,1.審批后要發郵件,可以通過郵件進行審批;2.審批同時要把下一步的審批人列出來(這個要特殊說一下,我的審批流,下一步的審批人是不確定的,根據配置和當前業務數據條件來決定下一步審批人)等等;
?實現這類需求,我有兩種選擇:一是在流程內部實現,但是這樣會導致業務與流轉混雜,流程流轉相關業務與流轉的是一定要分離,而且這種業務在我的公司變化的情況很多,開閉原則就不多說了;二是在流程外部實現,當然第一種PASS了我只能選這個了。
在流程外部實現,面臨的問題是:1.依賴注入了流程實現,所以流程過程中的信息完全獲取不到;2.兩種流轉機制差異極大,難以統一,無法統一返回信息的結構。
第一個問題的解決辦法,既然外部取不到,理所當然會想到,將外部需要流傳過程信息的方法傳給工作流的實現模塊,由工作流去執行,比如在審批結束時的后置事件:
//定義一個委托public delegate void ExecutionEndEventHandler//在工作流實現部分提供外部一個注冊的方法public override void RegisterExecutionEndEvent(Delegate executionEnd, string userID){if (executionEnd != null && DoRoleValidate(userID)){process.RegisterExecutionEndEvent(executionEnd);}}public void RegisterExecutionEndEvent(Delegate executionEnd){exec.ExecutionEnd += (WorkFlowEvent.ExecutionEndEventHandler)executionEnd;}//當外部需要時,只需要將事件注冊進來即可WorkFlowFactory.RegisterExecutionEndEvent(new WorkFlowEvent.ExecutionEndEventHandler(OnExecutionCompleted), "userID ");
第二個問題,費了些腦筋,最開始用了嵌套hashtable的方式實現的,但是始終感覺不舒服,看著就各種不舒服,最后終于在群里朋友深藍醫生的提醒下,想起微軟還有個.Data的命名空間,有個東西叫DataSet,它可以返回任意的結構,可結構的信息,這個…,著實太久不用下意識的就忘記了。
public void OnExecutionCompleted(DataSet process){DataTable work = process.Tables["work"]; }
至此,大體思路就確定下來了,剩下的比如注冊事件的權限,比如可以返回的信息控制等等,都是細節,我去鼓搗了,再見!
轉載于:https://www.cnblogs.com/saaav/p/3384337.html
總結
以上是生活随笔為你收集整理的流程流转相关业务与流转的分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我爱学习第一天(委托)
- 下一篇: location