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格式閱讀原文。

主站蜘蛛池模板: 九色在线视频导航91| 日本五区在线不卡精品| 一级黄色片网| 国产无人区一区二区三区| 97视频精品全国免费观看| 青青草一区二区免费精品| 99在线视频免费| 激情無極限的亚洲一区免费| www.亚洲一区| 日本在线免费网站| 国产精品99久久久| 国产超薄肉色丝袜网站| 日韩麻豆小视频| 久久a级片| 看你懂的巨臀中文字幕一区二区| 日本91在线| av在线无码浏览| 中文字幕免费在线视频| 国产后式a一视频| 中文字幕伦视频| 九九热精品视频在线| 中文字幕不卡免费高清视频| 国产美女在线观看| 六月婷婷精品视频在线观看| 久久一本精品久久久ー99| 欧美亚洲日韩中文| 97成人在线视频| 亚洲国产综合精品一区| 国产又爽又黄无遮挡免费观看| 亚欧美国产综合| 国产h视频免费观看| 亚洲av中文无码乱人伦在线r| 五月婷婷亚洲综合| 国产综合精品日本亚洲777| 亚洲免费毛片| 亚洲欧美日韩中文字幕一区二区三区 | AV在线麻免费观看网站| 97综合久久| 国内毛片视频| 日韩国产精品无码一区二区三区| 无码专区在线观看| 日韩麻豆小视频| 亚洲精品国产首次亮相| 国产午夜无码专区喷水| 中文字幕在线观| 亚洲 欧美 偷自乱 图片| 欧美亚洲另类在线观看| 久久精品丝袜| 日韩AV无码免费一二三区| a毛片基地免费大全| 精品国产91爱| 中文字幕佐山爱一区二区免费| 婷婷六月色| 亚洲精品无码成人片在线观看| 国产簧片免费在线播放| 97精品国产高清久久久久蜜芽| 欧美成人午夜视频免看| 亚洲综合色婷婷| 永久免费AⅤ无码网站在线观看| 成年人久久黄色网站| 大香伊人久久| 99热这里只有精品在线观看| 国产乱人伦AV在线A| 国产嫩草在线观看| 特级毛片免费视频| 亚洲国产精品日韩欧美一区| 亚洲天堂视频在线观看免费| 欧美福利在线| 免费啪啪网址| 久久综合伊人77777| 免费不卡视频| 亚洲一区二区三区中文字幕5566| 久久久久无码精品| 在线观看免费人成视频色快速| 国产精品毛片一区视频播| 91成人免费观看| 国产成人精品视频一区视频二区| 国产 日韩 欧美 第二页| 99在线视频免费| 久久精品人人做人人爽97| 国产毛片基地| 日韩高清欧美|