999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

按需構造的工作流系統組織模型

2007-01-01 00:00:00謝冬青
計算技術與自動化 2007年2期

摘 要:工作流系統作為基礎組件應該能夠與應用程序靈活集成,在設計工作流系統中的組織模型架構時應重點考慮與應用系統的集成方式#65377;設計基于工廠模式與反射技術的組件按需加載模型,降低軟件系統間的耦合#65377;實現工作流組織模型與不同類型的應用程序的良好集成#65377;基于該技術實現的項目管理系統在多個企業得到成功應用#65377;

關鍵詞:工作流;工廠模式;反射;耦合;按需加載;

中圖分類號:TP311文獻標識碼:A

1 引 言

隨著工作流技術的快速發展與逐步成熟,越來越多的應用系統將其作為必需的基礎部件#65377;為了將工作流集成到應用系統中,許多公司都開發了自己的工作流產品#65377;但是在開發過程中,一個需要重點解決的問題是如何實現工作流管理系統與應用系統的靈活集成#65377;由于工作流管理系統是一個公共部件,因此,它應該能夠很方便地與各種應用集成而又不破壞雙方的設計架構,這實際上是如何降低工作流管理系統與應用系統的耦合度的問題#65377;

在J2EE平臺下,有幾種技術可以很好地解決這個問題,如Spring框架#65380;Avalon框架#65380;PicoContainer輕量級容器等[6]#65377;但在.NET平臺下,卻沒有相應的框架產品#65377;另外,出于對性能的考慮,應用程序中沒有采用上述任何框架,因而需要設計一種足夠靈活的組件集成模型#65377;

2 耦合問題的分析

根據WfMC的定義,一個完整的工作流模型是由過程模型#65380;組織模型和資源模型構成的一個有機整體[4]#65377;實施基于工作流管理系統的應用時一個非常重要的任務就是將應用程序中的組織模型與工作流中的組織模型集成#65377;但是,由于應用程序和工作流產品是由不同團隊開發的,模型上的差異使得集成相當困難#65377;通常采用的方式是在應用程序中利用工作流提供的接口將組織數據寫入工作流系統中,以實現流程的工作指派#65377;但這種方式導致組織數據在兩個數據庫中重復存放,需要考慮數據的完整性和一致性管理,非常繁瑣#65377;如圖1所示#65377;

重復意味著耦合[1],這種數據庫的重復造成了兩個系統間不必要的耦合,它勢必要求在兩個數據庫之間保持一致,而完成這項工作是非常困難的#65377;一個自然的想法是去掉工作流環境中的組織數據庫而采用應用環境中的組織數據庫作為統一的組織數據存儲環境,這樣就解決了數據的一致性問題#65377;但是,在這種方式下,工作流中的組織模型組件需要訪問應用環境的組織模型組件,從而導致工作流組件對應用程序組件的依賴,這顯然是不行的#65377;這是因為不同的應用環境可能具有不同的組織模型和接口,開發工作流系統時不可能預知將和哪個應用程序集成,因而也就無法預知應用程序的組織模型的接口和組件#65377;即使通過制定統一的組織模型接口標準,還是需要在工作流組織模型中實例化應用系統的組織模型組件#65377;見圖2#65377;

這實際上是一個如何延緩接口實現的問題,即在開發工作流組件時只依賴共同的組織模型接口編程,而組織模型的實例化則在集成具體應用時完成#65377;

3 按需加載模型

在.NET 平臺下基于工廠模式和反射技術的按需加載模型提供了對這個問題的一個解決方案#65377;思路是:調用者通過工廠對象來實例化被調用組件,但由于被調用組件的可變性,不能在工廠代碼中固化實例化具體組件的代碼,因此我們借助于反射技術中組件的動態裝載技術,通過配置文件設置要實例化的組件,再由工廠類讀取配置,根據配置決定具體實例化哪個組件,這樣就實現了組件的按需加載#65377;

計算技術與自動化2007年6月第26卷第2期方 俊等:按需構造的工作流系統組織模型3.1 工廠模式

在傳統的編程方式中,控制權是由調用者掌握,即調用誰是由調用者決定的,因此,在調用者代碼中就包含了創建被調用者實例的代碼,這樣就構成了調用者對被調用者的依賴#65377;見下面的代碼(以下代碼都采用C#編寫):

在類A的代碼中定義了類B的引用變量,這種依賴是在編譯期引入的(前期綁定)#65377;根據文獻[3],這種依賴是造成軟件僵化(Rigidity)#65380;脆弱(Fragility)的主要原因#65377;DIP原則指出應該在調用者和被調用者間加入抽象接口,使調用者和被調用者都依賴于抽象接口,這樣,只要接口保持不變,被調用者的改變不會影響調用者,從而解決了軟件的僵化脆弱問題#65377;見圖3:

但是,引入抽象接口并沒有將調用者和被調用者完全解耦,只是將兩者間的依賴由前期綁定改成了后期綁定#65377;在調用者代碼中還存在直接創建被調用者實例的代碼#65377;見下面代碼:假設IB是一個接口,類B實現了接口IB#65377;

這種A和B的依賴關系導致了對組件B的調用的不可變性,如果存在多個實現了IB接口的類可以完成類似工作,在這種方式下就沒有辦法根據需要有選擇地調用所需的類#65377;GoF的《設計模式》中給出的工廠模式很好地解決了這個問題#65377;

簡單工廠模式[5]引入一個工廠類,負責根據需要來創建被調用者的實例,調用者通過工廠類獲得調用者實例#65377;這樣,在調用者代碼中就沒有對被調用者的直接引用,從而實現了調用者和被調用者間的真正解耦#65377;通常,工廠類時根據傳入的參數來決定創建哪個調用者實例的#65377;見圖4:

但是工廠模式對于有些情況卻無能為力,比如“耦合問題分析”一節中描述的組織模型調用問題:在編寫工作流軟件組件時無法預知將會和哪個應用程序集成,因此無法采用上述的工廠模式來實例化具體的應用程序中的組織模型組件#65377;必須有一種機制使得工廠可以在運行時選擇組件并對其進行實例化,也就是我們在工廠中不必固定地寫入要實例化的類的名稱,如圖4中的B1#65380;B2#65380;B3那樣#65377;

這種機制可以通過.NET平臺的反射技術實現#65377;

3.2 在工廠模式中使用反射

使用反射技術可以動態地裝載程序集,并從程序集動態地創建類型的實例[2]#65377;將反射技術與工廠模式結合,就可以實現組件的按需加載#65377;方法是:通過將組件的信息寫入一個XML文件,在工廠類中讀取配置文件并根據讀取的組件信息動態裝入組件,然后實例化所需類#65377;由于組件可以是不同的團隊根據公共接口標準實現的,因而也就實現了與不同應用系統的集成#65377;

依照上述思路,將工廠模式中的工廠類擴展成一個服務容器,該容器根據配置文件動態裝載組件,并將組件中的類封裝成一個個服務存放在服務集合中#65377;容器提供一個查找方法可以根據條件從集合中找到所需類的服務,返回給調用者,調用者通過服務對象可以獲得所需的類的實例#65377;注意,被封裝的類必須實現公共的接口#65377;見圖5#65377;

從圖5可以看到,由于采用了反射的動態裝載機制,調用者(A)與被調用者(B1#65380;B2#65380;B3)之間沒有了依賴關系,同時工廠類也沒有與任何具體的被調用者類存在依賴關系,這樣工廠就可以實現對被調用者組件的按需裝配#65377;只要組件實現了IB接口,就可以通過配置文件將其作為服務裝配到工廠中,調用者可以調用工廠類的方法(GetService)查找所需被調用者的服務,通過該服務提供的方法(GetInstance)可以獲取被調用者類的實例#65377;

工廠類以單例模式[5]實現,目的是保證服務容器的一致性#65377;在其中實現一個靜態方法CreateFactoryInstance,用于獲得工廠實例#65377;在工廠類的構造函數中讀取配置文件,獲得當前系統配置的組件信息,并將這些組件信息封裝成一個個的服務,存放在集合Services中#65377;在封裝一個服務時需要有接口#65380;實現類#65380;程序集文件等信息,因此,在配置文件中每條配置信息需要有上述內容#65377;下面是一個配置文件的例子#65377;

其中,InterfaceName是接口的完全限定名,ClassName是實現類的完全限定名,AssemblyFile是程序集文件名#65377;

在工廠類中集合Services存放的服務對象是Service的實例#65377;Service類中存放有接口名#65380;類名#65380;程序集文件名,這些信息是在工廠封裝服務時通過構造函數存入的#65377;見下面代碼:

為了讓調用者可以獲得所需的服務,工廠類中還提供了方法GetService,它根據調用者提供的接口名在集合Services中查找對應的服務#65377;見下面代碼:

3.3 組織模型的按需構造

有了上述的工廠,我們可以在工作流系統中定義組織模型的接口,并要求與之集成的應用程序實現這些接口,然后在配置文件中對這些信息進行配置,這樣,在工作流系統中就可以通過工廠類對象動態獲得應用程序的組織模型組件的實例,并通過這些實例完成對組織數據的操作#65377;下面以組織模型中的部門為例說明其實現:

首先在工作流系統中定義接口IDepartment,然后在應用程序中實現該接口,假設實現類為Department,并且編譯后的組織模型組件為Organization.dll,則配置文件的信息如上節所示#65377;

當在工作流系統中需要訪問組織數據時,可以采用下述代碼獲取Department的實例:

在工作流中對組織數據的訪問完全是透明的,它不必在編譯期連接確定的組件,而是通過在執行時動態裝載特定組件實現對組織數據的訪問#65377;在本實例中我們并沒指定應用程序是什么,它可以是工程項目管理系統也可以是ERP系統,只要實現了工作流中定義的組織模型接口,就可以將其寫入配置文件讓工作流系統調用#65377;這樣,極大地增強了工作流系統的靈活性,方便其與各種應用系統的集成#65377;

4 結束語

通過將工廠模式與反射技術結合實現組件的動態加載,解決了工作流系統的組織模型與應用系統的組織模型的集成難題,使得基于不同數據庫系統開發的工作流系統和應用系統可以很好的集成在一起#65377;基于這一技術實現的工作流系統已在多個鋼鐵企業的工程項目管理系統中得到了成功的應用#65377;

注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。

主站蜘蛛池模板: 97se亚洲综合在线天天| 91亚洲精品国产自在现线| 免费观看国产小粉嫩喷水| 一区二区影院| 日韩无码白| 国产成人高清在线精品| 国产青榴视频在线观看网站| 国产精品乱偷免费视频| 国产91视频观看| 先锋资源久久| 国产女人水多毛片18| 国产亚洲视频免费播放| 91麻豆久久久| 久久综合五月婷婷| 亚洲最大情网站在线观看| 中文字幕在线免费看| 日本人真淫视频一区二区三区| 日韩人妻无码制服丝袜视频| 欧美视频免费一区二区三区| 尤物视频一区| 九九热精品视频在线| 久久一本精品久久久ー99| 手机在线国产精品| 久久精品中文字幕免费| 四虎精品黑人视频| 欧美国产视频| 人妻无码一区二区视频| 91色爱欧美精品www| 国产极品美女在线| 999精品色在线观看| 欧美日韩成人| 国产农村妇女精品一二区| 午夜天堂视频| 日本欧美一二三区色视频| 亚卅精品无码久久毛片乌克兰| 欧美精品伊人久久| 好久久免费视频高清| 亚洲成人免费在线| 国产特一级毛片| 中文字幕调教一区二区视频| 五月天久久综合| 日韩精品无码免费专网站| 免费jjzz在在线播放国产| 国产精品一区二区在线播放| 亚洲三级视频在线观看| 国产精品男人的天堂| 国产中文一区a级毛片视频| 亚洲精品欧美日本中文字幕| 女人一级毛片| 国产免费高清无需播放器| 91九色最新地址| 人妻中文久热无码丝袜| 亚洲综合九九| 毛片基地视频| 精品一区二区三区自慰喷水| 亚洲高清免费在线观看| 国产精欧美一区二区三区| 免费一看一级毛片| 欧美日韩高清在线| 欧美丝袜高跟鞋一区二区| 亚洲精品va| 国产精品女熟高潮视频| AV片亚洲国产男人的天堂| 亚洲AV无码乱码在线观看裸奔 | 97色伦色在线综合视频| 四虎在线高清无码| 亚洲一级毛片| 国产玖玖玖精品视频| 亚洲AⅤ综合在线欧美一区| 亚洲国产精品无码久久一线| 日韩免费毛片| 99久久精品无码专区免费| 久久久无码人妻精品无码| 亚洲乱码视频| 免费a在线观看播放| 久久精品无码一区二区日韩免费| 制服丝袜一区| 免费国产无遮挡又黄又爽| 国产免费福利网站| 亚洲人成高清| 99视频在线免费| 91免费国产高清观看|