其實寫這篇文章的目的最多的想法是把自己在去年在瑞士做項目時應用的一個框架給展現出來讓大家共享,但我又有點擔心我的表達能力不能將我在裡面使用的思想很好的表現出來,所以遲遲 不敢下筆,最後還是下了決心,寫吧, 不行就在好好改改,當然也希望大家多提些意見。
一.背景
在現在的網站中,接入的渠道是越來越多了,技術也是越來越先進,WAP, SMS,EMAIL, 傳統的Web, Socket等等,如果連數據庫和LDAP也算接入的話,那在設計之中需要擴展的空間要做到很好 很好,才保證在添加新的渠道情況下不需要更多的修改代碼甚至不改代碼的情況。但可能嗎?我想也不可能,但有什麼方式可以更好的解決這種多渠道接入的框架的完美性呢?
二.構架
【圖一】
如圖一所顯示,在現有的所有接入都已經使用上的時候,設計者看的都眼花缭亂了,如果是為了湊份子,那這些程序怎麼寫都可以,而且也肯定可以實現,但維護起來就會比較痛苦,還是回到那個問題,怎麼可以實現更完美呢?在項目組的構架討論中,我提出了路由的感念,並得到了大
家統一的認可,如圖二顯示
【圖二】
圖二看起來象個八爪的章魚,章魚腿分別連接所有的接入渠道,進行連接所有這些渠道的核心就是這個章魚的頭XMLRouter,Router在此的作用是溝通所有渠道,實現數據的路由,爭強系統在構架上的擴展性和靈活性,好處會很多很多。稱呼為XMLRouter是因為如果不使用XML這種靈活而又規范的語言來做為數據傳輸的媒介,那Router的工作量也同樣會成倍的增加,定義好XML的規范後將為以後的擴展帶來很多好處.
三.思想和模式
XMLRouter的最初想法來自於計算機的主板和<<Design Pattern>>之中的Builder Pattern, 計算機主板的PCI 插槽定義了PCI的規范,只要你生產的卡符合PCI標准,那你插入到這個主板上就可以工作, 至於裡面是怎麼工作的則是已經封裝好了. Builder Pattern則是提出將復雜的構建分離開來, 一步一步的進行實現.XMLRouter是將這些復雜的渠道分離開來,一個個的進行表現.
Services思想:為了能和Router進行溝通,在這些渠道接入時必須定義統一的接口,這裡成為Services, 只要符合Services規范的程序就可以接入到Router並進行數據的路由.
Factory模式和Composite模式
XMLRouter在實際的設計中將采用Factory模式產生,Router由RouterFactory生產, 在投入使用時將放置於隊列中,傳遞數據和接收數據以及返回數據都從隊列中取相應的Router來調用,應用了Composite的模式.
四.XML配置文件
XML文件對於Router之中的使用分為兩個部分, 第一個是Router的配置,如:
<?xml version="1.0" ?>
<services>
<!-- database Service -->
<service name="database" type="database" class="com.web.service.DBService">
<connector
driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://192.168.0.179:1433" user="test"
passwd="test" />
</service>
<!-- Web Service-->
<service name="web" type="web" class="com.web.service.WebService" >
<connector />
</service>
……
</services>
這是Router的配置文件, service節點代表需要接入的渠道, service節點包含connector子節點, 子節點的配置根據type來區分, 如果是database則包含url, user, passwd,driver等屬性, 如果是socket則包含 port, maxthread等屬性, 屬性值可以根據自己的定義來配置.
另一種XML文件則是XML交易數據文件,用於在所有的services中傳遞數據,每個Services自己包涵一個相應的XML文件,比如webtrans.xml格式如下:
<?xml version="1.0" ?>
<transaction>
<trans name="addDoc" service="database" method="insert">
<property name="createtime" type="timestamp"/>
<property name="creatorid" type="long"/>
<property name="doctypeid" type="int"/>
<property name="docstatusid" type="int"/>
</trans>
</transaction>
相應的dbtrans.xml格式如下
<trans name="addDoc" table="TDOC_DOCS" method="insert">
<primarykey name="docid" />
<set>
<property name="createtime" type="timestamp"/>
<property name="creatorid" type="long"/>
<property name="doctypeid" type="int"/>
<property name="docstatusid" type="int"/>
</set>
</trans>
上一頁
12 下一頁 閱讀全文