12.洋蔥架構(gòu)(譯)

原文:https://herbertograca.com/2017/09/21/onion-architecture/

這篇文章是軟件架構(gòu)編年史()的一部分,這部編年史由一系列關(guān)于軟件架構(gòu)的文章組成漠畜。在這一系列文章中风题,我將寫下我對軟件架構(gòu)的學(xué)習(xí)和思考茸苇,以及我是如何運(yùn)用這些知識的。如果你閱讀了這個系列中之前的文章,本篇文章的的內(nèi)容將更有意義应媚。

2008 年 Jeffrey Palermo 提出了洋蔥架構(gòu)珊泳。在我看來鲁冯,它在端口和適配器架構(gòu)的基礎(chǔ)上貫徹了將領(lǐng)域放在應(yīng)用中心,將傳達(dá)機(jī)制(UI)和系統(tǒng)使用的基礎(chǔ)設(shè)施(ORM色查、搜索引擎薯演、第三方 API...)放在外圍的思路。但是它前進(jìn)了一步秧了,在其中加入了內(nèi)部層次跨扮。
 
我們從通常擁有四個層次(表現(xiàn)層、應(yīng)用層示惊、領(lǐng)域?qū)雍酶邸⒊志没瘜?的分層架構(gòu)發(fā)展到了端口和適配器架構(gòu),它只是含蓄地提到了兩個同心圓層次:

  1. 代表傳達(dá)機(jī)制和基礎(chǔ)設(shè)施的外層米罚;
  2. 代表業(yè)務(wù)邏輯的內(nèi)層钧汹。

端口和適配器架構(gòu)與洋蔥架構(gòu)有著相同的思路,它們都通過編寫適配器代碼將應(yīng)用核心從對基礎(chǔ)設(shè)施的關(guān)注中解放出來录择,避免基礎(chǔ)設(shè)施代碼滲透到應(yīng)用核心之中拔莱。這樣應(yīng)用使用的工具和傳達(dá)機(jī)制都可以輕松地替換碗降,可以一定程度地避免技術(shù)、工具或者供應(yīng)商鎖定塘秦。

另外讼渊,它還有著脫離真實(shí)基礎(chǔ)設(shè)施和傳達(dá)機(jī)制應(yīng)用仍然可以運(yùn)行的便利,這樣可以使用 mock 代替它們方便測試尊剔。

然而爪幻,洋蔥架構(gòu)還告訴我們,企業(yè)應(yīng)用中存在著不止兩個層次须误,它在業(yè)務(wù)邏輯中加入了一些在領(lǐng)域驅(qū)動設(shè)計的過程中被識別出來的層次:

此外挨稿,它明確了端口和適配器架構(gòu)中關(guān)于依賴方向的暗示:

  • 外層依賴內(nèi)層;
  • 內(nèi)層對外層無感知京痢。

也就是說耦合的方向是從外層指向中心奶甘,它提供了一個完全獨(dú)立的對象模型(領(lǐng)域模型),該模型位于架構(gòu)的核心祭椰,不依賴其它任何層次臭家。我們擁有了在不影響內(nèi)層的情況下改變外層的靈活性。它在架構(gòu)層面運(yùn)用了依賴倒置原則方淤。

洋蔥架構(gòu)的關(guān)鍵原則:

  • 圍繞獨(dú)立的對象模型構(gòu)建應(yīng)用
  • 內(nèi)層定義接口钉赁,外層實(shí)現(xiàn)接口
  • 依賴的方向指向圓心
  • 所有的應(yīng)用代碼可以獨(dú)立于基礎(chǔ)設(shè)施編譯和運(yùn)行

—— Jeffrey Palermo 2008, The Onion Architecture: part 3

還有,任何一個外部層次都可以直接調(diào)用任何一個內(nèi)部層次臣淤,這樣既不會破壞耦合的方向橄霉,也避免了僅僅為了追求分層模式而創(chuàng)建一些沒有任何業(yè)務(wù)邏輯的代理方法甚至代理類。這和 Martin Flowler 表達(dá)的偏好一致邑蒋。

[…] 上層可以使用它們下面的任意層次姓蜂,而不僅僅是它們直接的下層∫降酰——Jeffrey Palermo 2008, The Onion Architecture: part 3

總結(jié)

洋蔥架構(gòu)在端口和適配器架構(gòu)的基礎(chǔ)之上增加了一些的應(yīng)用業(yè)務(wù)邏輯的內(nèi)部組織钱慢,這些組織基于領(lǐng)域驅(qū)動設(shè)計的概念劃分的。

這又是一次職責(zé)分離的更深入的演化卿堂,帶來了高內(nèi)聚低耦合束莫,反過來也帶來了更好的可測試性和可維護(hù)性。

引用來源

2002 – Martin Fowler – Patterns of Enterprise Application Architecture

2008 – Jeffrey Palermo – The Onion Architecture: part 1

2008 – Jeffrey Palermo – The Onion Architecture: part 2

2008 – Jeffrey Palermo – The Onion Architecture: part 3

2013 – Jeffrey Palermo – The Onion Architecture: part 4 – After Four Years

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草描,一起剝皮案震驚了整個濱河市览绿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穗慕,老刑警劉巖饿敲,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逛绵,居然都是意外死亡怀各,警方通過查閱死者的電腦和手機(jī)倔韭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓢对,“玉大人寿酌,你說我怎么就攤上這事∷队迹” “怎么了醇疼?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長法焰。 經(jīng)常有香客問我僵腺,道長,這世上最難降的妖魔是什么壶栋? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮普监,結(jié)果婚禮上贵试,老公的妹妹穿的比我還像新娘。我一直安慰自己凯正,他們只是感情好毙玻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廊散,像睡著了一般桑滩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允睹,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天运准,我揣著相機(jī)與錄音,去河邊找鬼缭受。 笑死胁澳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的米者。 我是一名探鬼主播韭畸,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔓搞!你這毒婦竟也來了胰丁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤喂分,失蹤者是張志新(化名)和其女友劉穎锦庸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妻顶,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酸员,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年蜒车,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔嗦。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酿愧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邀泉,到底是詐尸還是另有隱情嬉挡,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布汇恤,位于F島的核電站庞钢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏因谎。R本人自食惡果不足惜基括,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望财岔。 院中可真熱鬧风皿,春花似錦、人聲如沸匠璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夷恍。三九已至魔眨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酿雪,已是汗流浹背遏暴。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留指黎,地道東北人拓挥。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像袋励,于是被迫代替她去往敵國和親侥啤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你茬故,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料盖灸? 從這篇文章中你...
    hw1212閱讀 12,693評論 2 59
  • MVC的關(guān)鍵是給我們提出了一個原則:怎么對項目進(jìn)行合理的關(guān)注點(diǎn)分離。Model負(fù)責(zé)業(yè)務(wù)領(lǐng)域磺芭,controller負(fù)...
    小聰明李良才閱讀 476評論 0 1
  • 這篇文章是翻譯(Uncle Bob Martin)的文章赁炎。 原文在這:The Clean Architecture...
    artshell閱讀 3,017評論 0 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 今天下午課后服務(wù)的時候,高翔借給我看了一本他從家里帶的書,這本書是長方形的很厚徙垫,名字是《謎語300首》讥裤,一...
    45cbff51831c閱讀 3,161評論 0 0