人類社會的一切事物都是來源於對造物主智慧的學習,人類本身是不會創造任何東西的。
外國新技術並不能作為軟件架構的終極准則,因為老外也是人。我認為客觀世界的架構應該是軟件架構的唯一准則,換而言之,上帝也是一個架構師,而這個客觀世界就是他的作品。
有這么完美的學習對象,為什么要舍本逐末呢?
就拿領域對象的設計來說,在客觀世界中,人如果要做某件事情,比如掃地這個動作,掃地難道是人自己完成的嗎?其實掃地是人借助掃帚這個工具完成的。
換而言之,領域對象的一些動作,也根本不屬於他自己,如果你把這些動作硬要強加在領域對象身上,就肯定會出現類似領域對象中調用技術層這種別扭的問題。
比如,經常有什么貧血對象,和充血對象之類的討論,這其實很可笑,保存、刪除、這些概念,本身是在計算機領域才存在的概念,現在大家都想把他強加在領域對象上,領域對象本身是對業務的模擬,怎么可能有這些動作?大家也覺的不妥,於是就繞彎彎,想發明一種說法和思想,自己說服自己,讓這件事情變的合理。但是這在本質上就是錯誤的,這種追求也是徒勞的。
DOMAIN就應該只關注於領域對象之間的關系和行為就足夠了,涉及到技術的,都交給其他層完成,而不是非要在DOMAIN中加上技術性的操作,你覺得別扭,這是必然的,因為在原本的業務概念中,根本不存在這中技術性的概念!領域對象,應該僅僅關注自身狀態和行為,以及和其他領域對象之間關系的建立,至於一切計算機領域的概念(比如保存、刪除這些概念),都不應該出現在領域對象中,因為這是違背自然規律的組合,或者說是違背業務概念的。
領域模型中的對象之間既然有關系,就肯定需要相互協作共同完成某個更大的業務邏輯;那么如何協作呢?目前最優雅並能確保領域對象處於核心主動地位的方式是通過Domain Event;在C#,Java這樣的語言中,對象天生並不具備發送消息和接收消息的能力,需要依賴於外部框架;而像Scala的Akka那種Actor Model,一個領域對象就是一個Actor,Actor能夠通過發送異步消息和其他Actor通訊聯系,這種消息發送是異步的,屬於“fire-and-forget”方式。那么在C#這樣的語言下,我們可以通過Domain Event也可以達到類似Actor一樣的效果;
Domain Event是EDA(Event Driven Architecture)思想的一種體現,EDA原本是用於SOA(Service Oriented Architecture)中,服務與服務之間的通信;Domain Event則是將EDA用於領域對象之間的通信;
引入Domain Event主要目的是為解決如何將領域模型和技術架構進行解耦,讓領域模型不依賴於特定的技術架構實現,從而可以讓領域模型真正反映純粹的業務模型。