在ddd設(shè)計中我們經(jīng)常會提到服務(wù)層,服務(wù)層是什么?職責(zé)是什么?有什么好處?。
創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨(dú)特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠?yàn)樾袠I(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式營銷型網(wǎng)站建設(shè)需求,讓再小的品牌網(wǎng)站設(shè)計也能產(chǎn)生價值!先看簡單的層次圖(注:這里并沒有考慮其他多余的領(lǐng)域邏輯數(shù)據(jù)層存儲,或者UOW這些細(xì)節(jié))
我的理解是服務(wù)層是處于我的應(yīng)用程序業(yè)務(wù)層和表現(xiàn)層之間的應(yīng)用程序邊界,邊界可能是很薄的一層類設(shè)計或者是分布式服務(wù)網(wǎng)絡(luò)躍點(diǎn)。它是一個與技術(shù)無關(guān)的名詞。由表現(xiàn)層直接調(diào)用,契約,執(zhí)行命令(修改狀態(tài)(CUD))或者是查詢返回dto(數(shù)據(jù)遷移對象)(cms,命令-查詢分離)。他對業(yè)務(wù)邏輯層接口很清楚,組織業(yè)務(wù)邏輯 微服務(wù)形成宏服務(wù),適配表現(xiàn)層。
這里談到宏服務(wù)和微服務(wù),宏服務(wù)有一些列粗粒度的服務(wù)組成。用戶的一次操作usecase,比如電子商務(wù)下單,CreateOrder就是一個宏服務(wù),而不是下單中的細(xì)粒度的商品庫存檢查,訂單合法性等。而與之對應(yīng)的微服務(wù)(有時也叫應(yīng)用程序服務(wù)),則表現(xiàn)為問題領(lǐng)域邏輯細(xì)節(jié),就如上面的庫存檢查和合法性檢查這些細(xì)粒度的服務(wù)。宏服務(wù)是由一個或者多個微服務(wù)組成,有時我們的usecase邏輯很簡單服務(wù)層僅由單一微服務(wù)組成,變現(xiàn)為很簡單的幾句微服務(wù)調(diào)用。
服務(wù)層的職責(zé):
1:在面軟件開發(fā)不管是結(jié)構(gòu)化編程(sp)還是面向?qū)ο缶幊蹋╫op)我們一直都強(qiáng)調(diào)高內(nèi)聚低耦合,分離關(guān)注點(diǎn)(soc)。服務(wù)層處于應(yīng)用程序和業(yè)務(wù)層之間,應(yīng)用邊界,使得兩次直接解耦,利用第三個對象破壞兩對象直接的依賴,并轉(zhuǎn)化適配領(lǐng)域?qū)ο螅╠o)和試圖對象(vo)的差異。
2:服務(wù)層隱藏了業(yè)務(wù)邏輯層的細(xì)節(jié),其內(nèi)部需要組織業(yè)務(wù)微服務(wù),提供更宏觀,面向表現(xiàn)層的服務(wù)邏輯,利用契約接口暴露,包裝。系統(tǒng)所有的交互都是從表現(xiàn)層進(jìn)入。
目前流行SOA架構(gòu),提供了一種分布式服務(wù)架構(gòu),以服務(wù)為關(guān)注點(diǎn),提高服務(wù)和業(yè)務(wù)邏輯的重用,但是這里說的服務(wù)并不是特定的技術(shù)wcf或者webservice,服務(wù)同時候可能是一次規(guī)定契約的一些列粗粒度組織的類組成。但是利用SOA或者M(jìn)TS建立服務(wù)會讓我們的服務(wù)得到跟多的附加優(yōu)勢,例如安全,事物,日志,擴(kuò)展性的提升。
服務(wù)層帶來的優(yōu)勢:如上所述服務(wù)層為表現(xiàn)層提供的同一的接口契約和入口。讓我們的業(yè)務(wù)層可以關(guān)注與實(shí)現(xiàn)問題領(lǐng)域邏輯,問題領(lǐng)域?qū)嶋H需求。組織微服務(wù)避免太多的細(xì)粒度服務(wù)的調(diào)用充斥在我們的項(xiàng)目表現(xiàn)層和問題領(lǐng)域中,過多的交互。如果采用soa等服務(wù)領(lǐng)域可以讓我們的應(yīng)用程序輕易的跨過應(yīng)用程序邊界和網(wǎng)絡(luò)躍點(diǎn)。但是需要付出一點(diǎn)的性能代價。
數(shù)據(jù)遷移對象(dto)就是攜帶數(shù)據(jù)穿過應(yīng)用程序邊界的對象,減少數(shù)據(jù)的交互次數(shù),常常我們將其作為值對象,只是一組簡單的get,set屬性組成,不存在行為操作,僅僅為數(shù)據(jù)的載體。在領(lǐng)域設(shè)計中dto是一個很重要的模式,不是我們所有的領(lǐng)域?qū)ο蠖寄茌p松的到達(dá)表現(xiàn)層,僅僅表現(xiàn)層和領(lǐng)域?qū)硬渴鹪谕晃锢砦恢?。如果需要穿過網(wǎng)絡(luò)躍點(diǎn)或者進(jìn)程邊界,因?yàn)轭I(lǐng)域?qū)ο笫刮覀兊臉I(yè)務(wù)的核心存在很多的自然世界的關(guān)系,依賴,甚至可能存在循環(huán)依賴比如電商用戶和訂單,用戶用戶一組訂單的集合,而每個訂單都指向一個特定的用戶,我們就必須破換掉這種循環(huán)依賴,才可能使其可序列化,穿過躍點(diǎn)。其次我們的領(lǐng)域?qū)ο笸际且欢杨I(lǐng)域富對象,存在大量數(shù)據(jù),很多時候我們的場景并不需要全部的數(shù)據(jù)信息。有了dto的存在就能很好的解決這些問題,是的我們的項(xiàng)目變得simple(keep it simple,Stupid。 KISS原則)。
但是與此同時dto存在會為我們帶來一些額外的復(fù)雜度,我們必須有一層do到dto的映射適配層。
理論上完美的設(shè)計我們需要為每一個應(yīng)用定義一個dto,但是在一個復(fù)雜的系統(tǒng)中我們可能存在很多的領(lǐng)域?qū)ο?,加?00個do,每個do一般都會存在多個dto,這將一個增加一個龐大的集合和mapping邏輯,對于維護(hù)也存在不小的挑戰(zhàn)。在軟件領(lǐng)域存在一句話就是bug的數(shù)量隨著代碼量增加,代碼量增加需要測試點(diǎn)也隨著增加。除非我們必須跨越應(yīng)用程序網(wǎng)絡(luò)躍點(diǎn)邊界,我覺得否則我們也可以存在一些簡單do的直接使用。根據(jù)世界項(xiàng)目,情形由我們的架構(gòu)師決定。