唯一不變的就是一直在變”--“數(shù)據(jù)”的華麗“變身術(shù)”
系列文章索引:
[WCF郵件通信系統(tǒng)應(yīng)用 之 數(shù)據(jù)同步程序 之 設(shè)計內(nèi)幕 之 一]
同步一個數(shù)據(jù)庫要發(fā)多少個數(shù)據(jù)包?
[WCF郵件通信系統(tǒng)應(yīng)用 之 數(shù)據(jù)同步程序 之 設(shè)計內(nèi)幕 之 二]
"開門待客"還是“送貨上門”?
[WCF郵件通信系統(tǒng)應(yīng)用 之 數(shù)據(jù)同步程序 之 設(shè)計內(nèi)幕 之 三]
“設(shè)計應(yīng)對變化”--實例講解一個數(shù)據(jù)同步系統(tǒng)
[WCF郵件通信系統(tǒng)應(yīng)用 之 數(shù)據(jù)同步程序 之 設(shè)計內(nèi)幕 之 四]
唯一不變的就是一直在變”--“數(shù)據(jù)”的華麗“變身術(shù)”
數(shù)據(jù)同步系統(tǒng)分為數(shù)據(jù)發(fā)送端和數(shù)據(jù)接收端,
在數(shù)據(jù)發(fā)送端,數(shù)據(jù)的“變化過程”如下:
1,使用ORM框架,從數(shù)據(jù)源查詢出數(shù)據(jù)到數(shù)據(jù)實體對象中;
2,數(shù)據(jù)實體對象經(jīng)過“消息轉(zhuǎn)換”組件,轉(zhuǎn)換成系統(tǒng)消息對象;
3,將系統(tǒng)消息對象放到郵件消息對象中(可能需要壓縮編碼等輔助工作);
4,使用郵件發(fā)送組件,將郵件消息對象發(fā)送到數(shù)據(jù)接收端。
在數(shù)據(jù)接收端,數(shù)據(jù)的變化過程跟發(fā)送端恰恰相反:
1,使用郵件收發(fā)組件,將郵件消息對象接收到消息隊列;
2,從郵件消息中取出系統(tǒng)消息對象;
3,使用“消息轉(zhuǎn)換”組件,獲得數(shù)據(jù)實體對象;
4,使用ORM組件,將數(shù)據(jù)實體對象存儲到目標數(shù)據(jù)庫中。
4,由數(shù)據(jù)同步系統(tǒng)到ESB
從上面的應(yīng)用架構(gòu)圖中我們看到,系統(tǒng)大致分為3部分:
1,數(shù)據(jù)處理子系統(tǒng),包括數(shù)據(jù)源、目標數(shù)據(jù)庫,ORM組件,數(shù)據(jù)實體對象;
2,消息處理子系統(tǒng),包括“消息轉(zhuǎn)換”組件,系統(tǒng)消息對象;
3,郵件通信子系統(tǒng),包括郵件郵件消息對象,郵件收發(fā)組件,郵件服務(wù)器;
整個系統(tǒng)的3大子系統(tǒng)都是獨立的,其核心在于“消息處理”子系統(tǒng),從應(yīng)用擴展來看,我們很容易想到以后系統(tǒng)可以擴展為如下結(jié)構(gòu):
A:業(yè)務(wù)處理子系統(tǒng)+消息處理子系統(tǒng)+郵件通信子系統(tǒng);
B:業(yè)務(wù)處理子系統(tǒng)+消息處理子系統(tǒng)+WCF / FTP子系統(tǒng);
C:業(yè)務(wù)處理子系統(tǒng)+消息處理子系統(tǒng)+消息總線
方案C,是不是很像我們常提起的ESB(企業(yè)服務(wù)總線)嗎?我們由一個設(shè)計方案,很順利的擴展出N種新方案,這就是“設(shè)計的魔力”,誰說設(shè)計沒用?
也許,你會覺得我“嘩眾取寵”,這些設(shè)計算啥啊,只是概念而已,項目有需要大伙加加班一樣可以很快搞出來,還是看不出設(shè)計有啥用。你要是這么說請給本文一個“雞蛋”,不用給“鮮花”了。
5,數(shù)據(jù)的“華麗”變身
我們先看看系統(tǒng)中的類關(guān)系圖,看看數(shù)據(jù)是怎么變化的:

第1變:由數(shù)據(jù)表到實體對象
在本系統(tǒng)中,數(shù)據(jù)不在是單純的數(shù)據(jù),而是對象,對象本身就是封裝數(shù)據(jù)和操作數(shù)據(jù)的方法的,系統(tǒng)使用PDF.NET數(shù)據(jù)開發(fā)框架將數(shù)據(jù)映射到了對象中,這樣的對象稱為“實體對象”,對于我們習慣的“數(shù)據(jù)表”而言,這是它的第一次變身;
第2變:由實體對象到消息對象
對于單純的數(shù)據(jù)處理系統(tǒng),將數(shù)據(jù)表映射成實體對象已經(jīng)足夠了,但是我們的設(shè)計目標是系統(tǒng)不僅僅只是處理數(shù)據(jù)的,至少,我們需要有“反饋對象”告訴我們數(shù)據(jù)的處理結(jié)果,“命令對象”告訴我們該怎么樣處理其它問題,而這些對象是不能夠直接跨越兩個局域網(wǎng)的,需要把它放到郵件或者其它地方,來和其它系統(tǒng)完成通信。所以,系統(tǒng)要求有統(tǒng)一的“消息對象”,方便系統(tǒng)內(nèi)部和系統(tǒng)間交互數(shù)據(jù)和調(diào)用功能、服務(wù)。
在這里,所有的其它對象到消息對象的轉(zhuǎn)換都是通過“消息處理”組件完成,其中,實體對象到消息對象的轉(zhuǎn)換使用了PDF.NET數(shù)據(jù)開發(fā)框架內(nèi)置的轉(zhuǎn)換類,將實體對象序列化成高效的二進制數(shù)據(jù)。
第3變:由系統(tǒng)消息對象到郵件消息對象
在步驟2中,轉(zhuǎn)換的都是普通的系統(tǒng)消息對象,經(jīng)過該步驟的轉(zhuǎn)換,系統(tǒng)間已經(jīng)可以正常交換消息了,但要把它通過郵件發(fā)送出去,還得有幾個處理過程,編碼,加密,壓縮,處理成最適合郵件系統(tǒng)處理的消息格式,最后使用郵件收發(fā)組件將郵件消息對象發(fā)送出去或者將郵件消息接收下來,存入郵件消息隊列。
至此,我們由普通的數(shù)據(jù),變成了普通消息對象,再到郵件消息對象,完成了我們的“華麗變身”,我們的數(shù)據(jù)不再是單純的數(shù)據(jù)了,它變成了對象,能夠適應(yīng)各種變化的對象。也許這個過程沒有那么直接,甚至效率會有一點點影響,但它能夠應(yīng)對各種可能的變化,能夠讓我們以統(tǒng)一的對象思維模式來考慮問題,現(xiàn)在,你問我這個系統(tǒng)干了什么,我的回答是:
“將對象由一個系統(tǒng)同步到了另外一個系統(tǒng)”,
而不是
“將數(shù)據(jù)從A庫同步到了另外一個局域網(wǎng)中的B庫”。
所以,我們的系統(tǒng)應(yīng)該改一個名字,不是現(xiàn)在的“數(shù)據(jù)同步系統(tǒng)”,而應(yīng)該是“對象同步系統(tǒng)”。
浙公網(wǎng)安備 33010602011771號