PhalApi使用的是ADM分層模式,Domain是連接Api層與Model層的橋梁。
在傳統(tǒng)Web框架中,慣用MVC模式??梢哉f,MVC模式是使用最為廣泛的模式,但同時也可能是誤解最多的模式。然而,接口服務這一領域,與傳統(tǒng)的Web應用所面向的領域和需要解決的問題不同,最為明顯的是接口服務領域中沒有View視圖。如果把MVC模式生搬硬套到接口服務領域,不但會產(chǎn)生更多對MVC模式的誤解,還不利于實際接口服務項目的開發(fā)和交付。
仔細深入地再思考一番,接口服務除了需要處理輸入和輸出,以及從持久化的存儲媒介中提取、保存、刪除、更新數(shù)據(jù)外,還有一個相當重要且不容忽視的任務——處理特定領域的業(yè)務規(guī)則。而這些規(guī)則的處理幾乎都是邏輯層面上對數(shù)據(jù)信息的加工、轉(zhuǎn)換、處理等操作,以滿足特定場景的業(yè)務需求。對于這些看不見,摸不著,聽不到的領域規(guī)則處理,卻具備著交付有價值的業(yè)務功能的使命,與此同時也是最為容易出現(xiàn)問題,產(chǎn)生線上故障,引發(fā)損失的危險區(qū)。所以,在接口服務過程中,我們應該把這些領域業(yè)務規(guī)則的處理,把這些受市場變化而頻繁變動的熱區(qū),單獨封裝成一層,并配套完備的自動化測試體系,保證核心業(yè)務的穩(wěn)定性。
基于以上考慮,在MVC模式的基礎上,我們?nèi)サ袅薞iew視圖層,添加了Domain領域業(yè)務層。從而涌現(xiàn)了Api-Domain-Model模式,簡稱ADM模式。
簡單來說,
Domain領域業(yè)務層,主要關注的是領域業(yè)務規(guī)則的處理。在這一層,不應過多關注外界客戶端接口調(diào)用的簽名驗證、參數(shù)獲取、安全性等問題,也不應過多考慮數(shù)據(jù)從何而來、存放于何處,而是著重關注對領域業(yè)務數(shù)據(jù)的處理。
傳統(tǒng)的接口開發(fā),由于沒有很好的分層結(jié)構,而且熱衷于在一個文件里面完成絕大部分事情,最終導致了臃腫漫長的代碼,也就是通常所說的意大利面條式的代碼。
在PhalApi中,我們針對接口領域開發(fā),提供了新的分層思想:Api-Domain-Model模式。即便這樣,如果項目在實際開發(fā)中,仍然使用原來的做法,縱使再好的接口開發(fā)框架,也還是會退化到原來的局面。
為了能讓大家更為明確Api接口層的職責所在,我們建議:
Api接口服務層應該做:
應該:調(diào)度領域業(yè)務層
Api接口服務層不應該做:
不應該:將多個接口合并在一起
Domain領域業(yè)務層應該做:
Domain領域業(yè)務層不應該做:
Model數(shù)據(jù)模型層應該:
在明確了上面應該做的和不應該做的,并且也完成了接口的定義,還有驗收測序驅(qū)動開發(fā)的場景準備后,相信這時,即使是新手也可以編寫出高質(zhì)量的接口代碼。因為他會受到約束,他知道他需要做什么,主要他按照限定的開發(fā)流程和約定稍加努力即可。
如果真的這樣,相信我們也就慢慢能體會到精益開發(fā)的樂趣。
至于調(diào)用關系,整體上講,應根據(jù)從Api接口層、Domain領域?qū)釉俚組odel數(shù)據(jù)源層的順序進行開發(fā)。
在開發(fā)過程中,需要注意不能越層調(diào)用也不能逆向調(diào)用,即不能Api調(diào)用Model。而應該是上層調(diào)用下層,或者同層級調(diào)用,也就是說,我們應該:
Model層調(diào)用Model層
如果用一張圖來表示,則是:
為了更明確調(diào)用的關系,以下調(diào)用是錯誤的:
錯誤的做法3: Model層調(diào)用Domain層
這樣的約定,便于我們形成統(tǒng)一的開發(fā)規(guī)范,降低學習維護成本。比如需要添加緩存,我們知道應該定位到Model層數(shù)據(jù)源進行擴展;若發(fā)現(xiàn)業(yè)務規(guī)則處理不當,則應該進入Domain層探其究竟;如果需要對接口的參數(shù)進行調(diào)整,即使是新手也知道應該找到對應的Api文件進行改動。
更多建議: