国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)Rest的研究與實(shí)現(xiàn)

2013-12-29 00:00:00阮永彬陳汶濱
電腦知識(shí)與技術(shù) 2013年1期

摘要:分析了現(xiàn)代企業(yè)級(jí)的Web應(yīng)用軟件的開(kāi)發(fā)現(xiàn)狀,并列舉了傳統(tǒng)的數(shù)據(jù)庫(kù)建模存在的問(wèn)題,從而引入領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)思想,該思想可以快速對(duì)用戶需求的變化做出快速反應(yīng),能夠使領(lǐng)域?qū)<液蛙浖_(kāi)發(fā)工程師有著共同的交流語(yǔ)言,在此思想上給出了一個(gè)應(yīng)用方案,即DDD+REST,并結(jié)合ESMISApp應(yīng)用實(shí)例,通過(guò)例子中一個(gè)簡(jiǎn)單的功能清晰描述了該方案的思想并完成了領(lǐng)域建模中的分層架構(gòu),很好滿足了現(xiàn)代企業(yè)級(jí)應(yīng)用軟件開(kāi)發(fā)需求。

關(guān)鍵詞:DDD;REST;HTTP;領(lǐng)域模型;面向?qū)ο?/p>

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)01-0092-04

目前,Web互聯(lián)網(wǎng)應(yīng)用得到了廣泛的關(guān)注,出現(xiàn)越來(lái)越多的應(yīng)用軟件特別是企業(yè)級(jí)的都在從傳統(tǒng)的C/S模式轉(zhuǎn)向B/S模式?;?Web 的多層架構(gòu)體系,例如J2EE、ASP.NET、Struts等已經(jīng)成為解決應(yīng)用的開(kāi)發(fā)體系。然而以傳統(tǒng)的數(shù)據(jù)庫(kù)建模為核心的軟件開(kāi)發(fā)Web多層架構(gòu)已經(jīng)遇到了瓶頸。導(dǎo)致這個(gè)瓶頸的根本原因是當(dāng)時(shí)語(yǔ)言本身的缺陷及體系本身需要完善等等,造成ASP.NET(J2EE)等域模型的開(kāi)發(fā)結(jié)構(gòu)一直為貧血模型。

1 數(shù)據(jù)庫(kù)建模方法存在的問(wèn)題

1.1 過(guò)程化編程

今天大部分應(yīng)用層軟件都是用面向?qū)ο筮^(guò)程開(kāi)發(fā),但這并不代表使用面向?qū)ο笳Z(yǔ)言就可以做到面向?qū)ο螅∣O)開(kāi)發(fā)。實(shí)際上以數(shù)據(jù)庫(kù)驅(qū)動(dòng)軟件開(kāi)發(fā)很容易導(dǎo)致面向過(guò)程化設(shè)計(jì)。因?yàn)閭鹘y(tǒng)的編程都遵循MVC三層模式的開(kāi)發(fā),首先確立數(shù)據(jù)結(jié)構(gòu),編寫(xiě)大量的存儲(chǔ)過(guò)程、事物、結(jié)構(gòu)查詢語(yǔ)句等都導(dǎo)致無(wú)法面向?qū)ο?,大量的業(yè)務(wù)邏輯都寫(xiě)在模型層中,而對(duì)數(shù)據(jù)對(duì)象并沒(méi)有任何行為,它只是一種容器,至包含set和get方法,最終導(dǎo)致了面向過(guò)程的思想,并沒(méi)有降低遵循高內(nèi)聚、低耦合的開(kāi)發(fā)。

1.2 需求分析的反應(yīng)不夠全面

在軟件開(kāi)發(fā)的設(shè)計(jì)中之所以運(yùn)用到面向?qū)ο蟮乃枷?,是因?yàn)樗先祟愃伎紗?wèn)題的方式,因此采用面向?qū)ο髷?shù)據(jù)庫(kù)是明智的選擇,它能使用面向?qū)ο蟮姆治龇椒ǎ∣OA)進(jìn)行需求分析使軟件的問(wèn)題域和解決域在一定層面保持一致。但目前的技術(shù)采用面向?qū)ο髷?shù)據(jù)庫(kù)設(shè)計(jì)還不夠很成熟且不是很普及,大部分都是主流的關(guān)系型數(shù)據(jù)庫(kù)。因此就會(huì)導(dǎo)致需求與實(shí)現(xiàn)出現(xiàn)脫節(jié)的現(xiàn)象,從而延緩了項(xiàng)目開(kāi)發(fā)進(jìn)度。

1.3 過(guò)分依賴數(shù)據(jù)庫(kù)

很多開(kāi)發(fā)的軟件都過(guò)分對(duì)數(shù)據(jù)庫(kù)的依賴,每次的對(duì)業(yè)務(wù)邏輯操作都是直接調(diào)用DAO(Data Access Object)來(lái)完成,無(wú)形中給數(shù)據(jù)庫(kù)造成了相當(dāng)大的壓力,而項(xiàng)目的需求也會(huì)不斷的在變化,數(shù)據(jù)庫(kù)結(jié)構(gòu)則也會(huì)一直在改變。過(guò)分依賴數(shù)據(jù)庫(kù)最終就造成整個(gè)系統(tǒng)的不協(xié)調(diào),隨著系統(tǒng)負(fù)載的不斷增加,數(shù)據(jù)庫(kù)壓力越來(lái)越大,最終數(shù)據(jù)庫(kù)因不堪重負(fù)而奔潰。

2 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的方法

自從 2003 年建模專家 Eric Evans 發(fā)表文獻(xiàn)之后,人們才開(kāi)始探討領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),它是建立在領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)的基礎(chǔ)上的開(kāi)發(fā)模式[1]。不僅僅能表現(xiàn)模型對(duì)象,還包括例如服務(wù)等在領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)所沒(méi)有涉及的元素。DDD摒棄了割裂建模與設(shè)計(jì)的做法,使用通用的領(lǐng)域模型來(lái)滿足這領(lǐng)域?qū)<液蛙浖O(shè)計(jì)人員雙方的要求。它指導(dǎo)我們從混亂和復(fù)雜的領(lǐng)域中找出秩序和規(guī)律,抽象出一套通用語(yǔ)言,這種語(yǔ)言是領(lǐng)域?qū)<?、系統(tǒng)分析師、軟件架構(gòu)工程師、集成開(kāi)發(fā)工程師、開(kāi)發(fā)人員共同交流的平臺(tái)。

根據(jù)Evans提出的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)開(kāi)發(fā)理念(如圖1所示),領(lǐng)域建模過(guò)程大致分為兩個(gè)步驟:首先是領(lǐng)域模型描述,模型中的領(lǐng)域?qū)ο蠓譃閷?shí)體、工廠、值對(duì)象、關(guān)聯(lián)、倉(cāng)庫(kù)、聚合、服務(wù)類[2];然后對(duì)這7類領(lǐng)域分別進(jìn)行封裝和訪問(wèn)權(quán)限的管理。

3 基于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的web

3.1 應(yīng)用軟件開(kāi)發(fā)框架REST

為了運(yùn)用該思想快捷的開(kāi)發(fā)Web應(yīng)用軟件,該文提出一種最新應(yīng)用方案,即DDD+REST開(kāi)發(fā),用實(shí)際的案例及具體的代碼的分析來(lái)描述該應(yīng)用方案是如何運(yùn)轉(zhuǎn),從而解決傳統(tǒng)架構(gòu)結(jié)構(gòu)復(fù)雜、開(kāi)發(fā)繁瑣的缺點(diǎn)。

REST是由Roy Thomas Fielding在其博士學(xué)位論文中提出的一種新的基于網(wǎng)絡(luò)的軟件架構(gòu)風(fēng)格。針對(duì)Web應(yīng)用的設(shè)計(jì)和開(kāi)發(fā)方式,可以簡(jiǎn)化開(kāi)發(fā)的復(fù)雜性,增強(qiáng)系統(tǒng)的可伸縮性[3]。REST的統(tǒng)一接口由4個(gè)部分組成:資源的標(biāo)識(shí)、通過(guò)表述對(duì)資源執(zhí)行的操作、自描述的消息、以及作為應(yīng)用狀態(tài)引擎的超媒體[4]。它具有客戶端會(huì)話無(wú)狀態(tài)、支持多級(jí)緩存、客戶端和服務(wù)器及其中間組件之間使用統(tǒng)一接口、清晰的分層系統(tǒng)、按客戶的需求他們可以從服務(wù)器下載可執(zhí)行的代碼在客戶端運(yùn)行等優(yōu)點(diǎn)。

對(duì)比REST和HTTP,不難發(fā)現(xiàn)兩者在諸多方面都十分相似,這也很容易理解,因?yàn)榇蟛糠諦/S架構(gòu)的web應(yīng)用軟件都是基于HTTP作為傳輸協(xié)議且Roy博士也是HTTP協(xié)議的主要?jiǎng)?chuàng)作者之一,所以REST和HTTP有很多的相似之處。

3.2 REST在Web應(yīng)用的優(yōu)勢(shì)

1)REST充分展現(xiàn)了HTTP作為應(yīng)用層協(xié)議的特性,而不必在此基礎(chǔ)上添加額外的功能模塊,提高了傳輸運(yùn)行效率[5]。

2)通常情況下,基于B/S的應(yīng)用軟件不僅僅只有客戶端到服務(wù)器,他們之間還存在一些中間組件,如網(wǎng)關(guān)、路由、代理等構(gòu)成了一系列的完整通信鏈路。由于HTTP對(duì)中間組件是可見(jiàn)的,所以REST采用HTTP作為通信機(jī)制,從而更有利于緩存,提高了服務(wù)器的可伸縮性。

3)REST資源本身包含了其它相關(guān)資源的鏈接,因此不需要單獨(dú)的資源發(fā)現(xiàn)機(jī)制,減輕了開(kāi)發(fā)成本。

4)由于資源表述形式的多樣性,使得REST能更好地與Web2.0的很多前端技術(shù)融合。

由上述可知,REST軟件架構(gòu)風(fēng)格不但能夠提高 Web service的運(yùn)行效率,還可極大地簡(jiǎn)化互聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)。因此將REST風(fēng)格應(yīng)用于實(shí)踐,具有巨大的現(xiàn)實(shí)意義。

4 應(yīng)用及實(shí)現(xiàn)

本文在REST軟件架構(gòu)風(fēng)格設(shè)計(jì)的基礎(chǔ)上,運(yùn)用DDD思想在Visual Studio 2010 開(kāi)發(fā)平臺(tái)下采用C# 語(yǔ)言實(shí)現(xiàn)。創(chuàng)建一個(gè)名為ESMISApp 的解決方案, 包括八個(gè)項(xiàng)目,項(xiàng)目結(jié)構(gòu)見(jiàn)圖2。

ESMIS.ddd.business項(xiàng)目定義了整個(gè)系統(tǒng)處理的邏輯業(yè)務(wù),該層只向外定義它有什么功能,能夠做什么,而不做具體的實(shí)現(xiàn)。

ESMIS.ddd.domain項(xiàng)目用于定于領(lǐng)域?qū)ο?,為了能夠?qū)崿F(xiàn)分布式處理,實(shí)現(xiàn)客戶端遠(yuǎn)程調(diào)用服務(wù),該文在該層定義領(lǐng)域?qū)ο螅▎晤?、聚類)Datacontract、DataMember等一些WCF的契約。

ESMIS.ddd.repository項(xiàng)目管理實(shí)體的集合并封裝其持久化過(guò)程。這里面說(shuō)明了資源庫(kù)管理實(shí)體對(duì)象的全生命周期。注意對(duì)實(shí)體對(duì)象生命周期管理的很多行為和操作已經(jīng)不在實(shí)體類中,而是在資源庫(kù)中,資源庫(kù)轉(zhuǎn)變?yōu)橐粋€(gè)操作類和類實(shí)例化后持久化的一個(gè)結(jié)合。

ESMIS.ddd.Libs項(xiàng)目主要用于整個(gè)解決方案的安全控制和服務(wù)路由操作。

ESMIS.rest.IDataServices項(xiàng)目定義了服務(wù)契約和操作契約接口,在.NET 4.0 中新增WebGet 和WebInvoke提供對(duì)Rest 支持,該文混合采用這兩種方式。WebGet屬性響應(yīng)HTTP GET請(qǐng)求,而WebInvoke屬性則響應(yīng)任何HTTP的POST、PUT、DELETE等請(qǐng)求,WebInvoke不僅可讀也可寫(xiě)。UriTemplate 是WCF為每種資源以模板的方式定義URI,ResponseFormat定義數(shù)據(jù)交互的格式,有JSON或XML兩種格式,該文主要采用JSON格式。

ESMIS.rest.IWebUIDo項(xiàng)目定義從客戶端請(qǐng)求請(qǐng)求資源的URI進(jìn)行相應(yīng)的Route Mapping。

ESMIS.rest.ServiceLibs項(xiàng)目主要定義客戶端請(qǐng)求URI服務(wù),控制全局restful。

ESMISApp項(xiàng)目主要是一些前臺(tái)頁(yè)面的設(shè)計(jì),包括圖片、CSS、JavaScript、xml、html等文件。

刪除功能的運(yùn)轉(zhuǎn)如圖3,其流向圖如圖4。

本文前臺(tái)頁(yè)面采用jquery框架,是一種輕量級(jí)的JavaScript庫(kù),運(yùn)用它可以很輕松的實(shí)現(xiàn)AJAX。其中ajaxToRest是自定義ajax異步操作函數(shù),url是要傳輸?shù)哪繕?biāo)地址,get傳輸方式,null代表刪除沒(méi)有數(shù)據(jù)傳輸,beforSend_ajax放松以前執(zhí)行的方法,function是成功以后的回調(diào)函數(shù),insertRegisterError_zy是發(fā)生錯(cuò)的回調(diào)函數(shù),Compeled_ajax是完成后的回調(diào)函數(shù)。

5 結(jié)束語(yǔ)

本文通過(guò)對(duì)傳統(tǒng)基于B/S模式Web應(yīng)用軟件的開(kāi)發(fā)的分析,披露了傳統(tǒng)模式開(kāi)發(fā)的各種缺陷及其滿足不了客戶的需求。在此基礎(chǔ)上提出了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)思想且嵌入了一種和web應(yīng)用軟件十分契合的REST軟件架構(gòu)風(fēng)格,通過(guò)這兩種技術(shù)的結(jié)合進(jìn)行軟件的設(shè)計(jì)和實(shí)現(xiàn)工作,取得了滿意的成果,增強(qiáng)了基于web傳輸安全性和相應(yīng)速度。

參考文獻(xiàn):

[1] Eric Evans.領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)[M].陳大峰,張澤鑫,譯.北京:清華大學(xué)出版社,2006.

[2] Abel Avran,F(xiàn)loyd Marinescu.領(lǐng)域驅(qū)動(dòng)設(shè)計(jì).精簡(jiǎn)版[EB/OL]. 孫向暉,霍泰穩(wěn),譯.http://infoq.com/cn/minibooks/domain-driven-desian-quickly.

[3] Roy Fielding. Architectural Styles and the Design of Network-based Software Architectures[D].2000.

[4] Richardson L,Ruby S.RESTful Web Services[M].北京:電子工業(yè)出版社,2007:35-37.

[5] Tikov S.回答關(guān)于REST的十點(diǎn)疑問(wèn)[J]. 徐涵,譯.程序員,2008(8): 97-99.

[6] 王一賓,李新科.軟件體系結(jié)構(gòu)設(shè)計(jì)方法的研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2005(3).

[7] Martin Fowler.重構(gòu)——改善既有代碼的設(shè)計(jì)[M].侯捷,熊杰,譯.北京:中國(guó)電力出版社, 2003.

[8] 彭晨陽(yáng).面向?qū)ο笈c領(lǐng)域建模[EB/OL].(2006-12-06)[2007-06-01].http://www.jdon.com/mda/modeling.html.

平昌县| 波密县| 钟祥市| 福安市| 绥棱县| 太仓市| 镇远县| 琼结县| 南京市| 香格里拉县| 丰城市| 南丰县| 庆云县| 红安县| 济阳县| 龙井市| 涟源市| 子长县| 都匀市| 齐河县| 肥乡县| 仁寿县| 鞍山市| 马山县| 那坡县| 繁昌县| 岐山县| 九江县| 乐亭县| 钟山县| 栾城县| 万载县| 鹤壁市| 墨脱县| 峨山| 定襄县| 枣阳市| 辰溪县| 东山县| 禹州市| 昌乐县|