DDD核心思想是由業務問題來控制解決方案的形式從以數據庫爲中心過渡到領域模型爲中心 html
下面這個圖是我在《領域驅動設計與模式實戰》書中拍下來的,他徹底詮釋DDD的經典分層。web
程序代碼中也是響應的引用關係數據庫
各層概念:設計模式
表現層(Presentation Layer):圖中的用戶界面層包括用戶接口層,用戶輸入和數據展現。api
應用層(Application Layer):應用層定義系統的業務功能,並指揮領域層中的領域對象實現這些功能。服務器
領域層(Domain Layer):核心層,實現全部業務邏輯。架構
基礎設施層(Infrastructure Layer):提供整個業務系統的基礎服務。併發
領域模型的切割: 領域驅動設計除了對系統架構進行了分層描述,還對對象(Object)作了明確的職責和策略劃分: 1、實體(Entities):具有惟一ID,可以被持久化,具有業務邏輯,對應現實世界業務對象。 2、值對象(Value objects):不具備惟一ID,由對象的屬性描述,通常爲內存中的臨時對象,能夠用來傳遞參數或對實體進行補充描述。 3、工廠(Factories):主要用來建立實體,目前架構實踐中通常採用IOC容器來實現工廠的功能。 4、倉庫(Repositories):用來管理實體的集合,封裝持久化框架。 5、服務(Services):爲上層建築提供可操做的接口,負責對領域對象進行調度和封裝,同時能夠對外提供各類形式的服務。
各層在編譯時的類依賴關係以下圖(這是一個很矮矬窮的圖):app
高層模塊不該該依賴於底層模塊,二者都應該依賴於抽象框架
抽象不該該依賴於細節,細節應該依賴於抽象。
ABP詳細分層:
咱們從上到下看看都是什麼意思:
表示層
Presentation:
View Models (Javascript):=
Views (HTML/CSS):=
Localization, Navigation, Notifications:多語言,菜單,通知
web:
Web API Controllers:webapi接口
MVC Controllers, OData:OData是什麼我也不知道
應用層(Application)
Application Services:應用服務
DTOs:數據傳輸對象
DTO Mappers:AutoMapper進行實體與DTO之間的映射
Authorization:參數驗證
Session:
Audit Logging:審計日誌
應用層提供一些應用服務(Application Services)方法供展示層調用。一個應用服務方法接收一個DTO(數據傳輸對象)做爲輸入參數,使用這個輸入參數執行特定的領域層操做,並根據須要可返回另外一個DTO。在展示層到領域層之間,不該該接收或返回實體(Entity)對象,應該進行DTO映射。一個應用服務方法一般被認爲是一個工做單元(Unit of Work)。用戶輸入參數的驗證工做也應該在應用層實現。ABP提供了一個基礎架構讓咱們很容易地實現輸入參數有效性驗證。建議使用一種像AutoMapper這樣的工具來進行實體與DTO之間的映射。
領域層(Domain(Core))
Entities:實體,領域對象,表明業務領域的數據和操做
value objects:實體模型
Repositories:倉儲,用來操做數據庫進行數據存取。倉儲接口在領域層定義,而倉儲的實現類應該寫在基礎設施層。
Domain Services:領域服務,當處理的業務規則跨越兩個(及以上)實體時,應該寫在領域服務方法裏面。
Domain Event:領域事件,在領域層某些特定狀況發生時能夠觸發領域事件,而且在相應地方捕獲並處理它們。
Unit of Work:工做單元,一種設計模式,用於維護一個由已經被修改(如增長、刪除和更新等)的業務對象組成的列表。它負責協調這些業務對象的持久化工做及併發問題。
基礎設施(Infrastructure)
ORM (EntityFramework, NHibernate):ORM框架,ABP提供了EF和NHibernate支持
DB Migrations:EF Code First建立數據庫用的
Background Jobs:做業調度和自動任務,(相似Quartz.NET)
補充(單頁面應用和多頁面應用)
在單頁面應用中(SPA),全部的資源都會一次性加載到客戶端(或者只加載核心資源,懶加載其餘資源),全部的後續和服務器的交互都是經過Ajax調用。Html代碼是使用從服務端接收到的數據在客戶端生成的。整個頁面不會刷新,視圖只是在必要時換入換出。有許多的Javascript SPA框架,好比AngularJs,DurandalJs,BackboneJs和EmberJs。ABP可使用它們中的任何一個,可是提供了使用 AngularJs和DurandalJs的樣例。
在多頁面(經典)應用中(MPA),客戶端向服務端發送請求,服務端代碼(ASP.NET MVC 控制器)從數據庫中獲取數據,而後Razor視圖引擎生成html 代碼。這些編譯後的頁面發回給客戶端顯示。每一個新的頁面都會致使完整頁面的刷新。
SPA和MPA涉及了徹底不一樣的架構。對於後臺管理系統來講,SPA是最好的候選者,另外一方面,博客更適合MPA模型,由於博客渴望被搜索引擎抓取數據。雖然有不少工具可使SPA對於搜索引擎可見,可是目前的通常作法就是使用MPA。
最後
ABP平衡了一些最好的框架或者類庫,除此以外,ABP本身的類和系統也提供了一個很好的用於N層架構Web應用構建的基礎設施,也提供了很輕鬆地建立分層的解決方案的模板,用做應用的起點。
根據分層咱們把項目的類庫用解決方案的文件夾整理下:
摘自:https://blog.csdn.net/orichisonic/article/details/51459709