深度剖析Byteart Retail案例 前言

2021-09-06 06:53:39 字數 2666 閱讀 6345

從2023年至今,我一直關注著與領域驅動設計相關的軟體開發過程與技術,在這幾年中,我堅持不懈地學習、實踐,在總結自己實踐經驗的基礎上,設計並開發了一套基於.net的面向領域驅動的企業應用程式開發框架,沿用我以前開發的乙個松耦合架構實驗原型,為之取名為apworks。為了向社群展示apworks在企業級應用開發上給開發人員帶來的便捷,我也針對apworks框架開發了一套面向cqrs架構的案例程式:tiny library cqrs。隨著apworks的不斷發展,tiny library cqrs也先後更新了兩個版本,毋庸置疑,第二版更為成熟,更貼近於實際專案應用。

然而,社群對tiny library cqrs的反饋卻不是那麼積極,分析原因,我覺得有三個方面:首先,基於事件溯源(event sourcing)機制的cqrs架構本身就非常複雜,套用世界級軟體架構大師udi dahan對cqrs架構的總結,就是:「簡單,但不容易(******, but not easy)」,要讓乙個對企業級軟體架構設計不太熟悉的開發人員掌握好cqrs相關的知識,是一件困難的事情,即使有現成的案例,也會讓人感覺無從下手;其次,目前大多數應用程式還遠沒達到需要使用cqrs架構的規模,在專案中應用cqrs,只能把簡單問題複雜化;再次,由於個人時間能力有限,tiny library cqrs案例本身也沒有提供太多的文件與說明,加上該案例直接使用了apworks框架,所以很多後台執行機制就變得不那麼明朗,這對希望研究cqrs架構的開發人員造成了一定的困難。因此,tiny library cqrs感覺就與真實專案的實踐脫節,自然關注的人就不多了。所以我打算暫時擱置tiny library cqrs的更新,讓其也成為乙個cqrs架構設計的參考原型,供有興趣的朋友參觀學習。

於是,從今年4月開始,我就著手開發並發展了另乙個面向領域驅動的.net企業級應用架構設計案例:byteart retail。與tiny library cqrs不同的是,byteart retail採用了面向領域驅動的經典分層架構,並且為了展示微軟.net技術在企業級應用開發中的應用,它所使用的第三方元件也幾乎都是微軟提供的:entity framework、asp.net mvc、unity ioc、unity aop、enterprise library caching等(用於記錄日誌的log4net除外,但log4net本身也是眾所周知的框架),所以,開發人員只需要開啟byteart retail的源程式,就能夠很清楚地看到系統的各個元件是如何組織在一起並協同工作的。經典分層架構的採用,也為實際專案帶來了參考和指導的價值。

圖一 byteart retail v1&v2 介面,略顯簡單

圖二 byteart retail v3 介面,比前兩版豐富不少

為了能讓感興趣的讀者朋友更好地了解到byteart retail的架構設計思路與方法,我在發布案例源**的同時,編寫了本文件。雖然從v2開始,我在源**中,加入了不少中文注釋,但畢竟注釋的描述能力有限,對於一些設計上的動態特性,或許使用圖表的表示方式會更加直觀,因此,我覺得除了向大家展示出源**之外,能讓大家擁有這樣乙份文件是很有必要的。

本文會跟隨「領域驅動設計」的經典分層方式,從基礎結構層、領域層、應用層和展示層四大部分對案例進行介紹。展示層的介紹會相對簡單一些,因為展示層更偏向於已有框架的技術應用,而且前台技術也不是我的技術強項,因此這方面的細節內容就只能靠讀者們自己研究發揮了。在基礎結構層部分,我將詳細介紹byteart retail所使用的與技術相關的內容,比如service locator與aop攔截、配置檔案和配置資訊讀取、異常處理、快取服務,以及基於entity framework的倉儲實現;在領域層部分,我將針對byteart retail的業務功能對領域建模進行討論,比如領域物件設計和聚合劃分等;在應用層部分,我會討論物件模型的失衡問題,同時還會向讀者介紹一些應用層相關的框架和技術。在學習和討論的過程中,我們會涉及到很多企業級應用架構模式,比如service locator模式(core j2ee patterns)、unit of work模式(poeaa)、separated inte***ce模式(poeaa)等;也會涉及到一些.net/c#慣用法,比如dispose模式不變物件(immutable object)、基於c#的singleton等,在文章中我也會以註解的方式向讀者闡述模式與慣用法在實際專案中的應用。希望能對學習企業應用架構模式的讀者有一定的幫助。

最後,說說本案例名稱的由來吧。retail很簡單,「零售」的英文單詞,表示本案例的業務背景;而byteart(位元組藝術),則是我剛開始學習程式設計的時候,跟我乙個同學組成的軟體工作室名稱。年輕人,對未來總會有很多夢想和期望,雖然除了乙個簡單的directx rpg遊戲引擎和小霸王學習機上用basic語言開發的掃雷遊戲(支援遊戲手柄的喔)以外,我們並沒有做成過什麼,但當年那種為夢想而奮鬥的激情卻總是無法忘記。將byteart用在本案例的名稱中,以紀念那段美好的時光。

ifdef cplusplus深度剖析

時常在cpp的 之中看到這樣的 ifdef cplusplus extern c endif 這樣的 到底是什麼意思呢?首先,cplusplus是cpp中的自定義巨集,那麼定義了這個巨集的話表示這是一段cpp的 也就是說,上面的 的含義是 如果這是一段cpp的 那麼加入extern c 處理其中的 ...

深度剖析ostream

雖然c 學了大半個月了,自己學了解了很多關於c 的知識,大的概念懂了不少,但是還是想說想要徹底的弄懂c 絕非易事。當別人問到乙個很小的知識點些許你都要愣很久,事實告訴我們不能太好高騖遠。為什麼要寫ostream而不是istream,因為當我們自定義型別 student類 的時候,如果需要輸出 stu...

MapReduce 深度剖析

mapreduce 深度剖析 在hadoop2.x大行其道的年代,其優秀的資源管理框架 系統 高可用的分布式儲存系統,備受企業青睞。然因上述之惑,往往不能盡得其中之深意。此篇部落格筆者為大家一一解惑。雖說我們能夠編寫乙個完成mapreduce程式,並執行它。然其執行的細節,我們卻未必清楚,往往初學者...