ABP官方文檔翻譯 1.2 N層架構
N層架構
- 介紹
- ABP架構
- 其他(通用)
- 領域層
- 應用層
- 基礎設施層
- 網絡和展現層
- 其他
- 總結
介紹
應用程序代碼庫的分層架構是被廣泛認可的可以減少程序復雜度、提高代碼復用率的技術。為了實現分層架構,ABP遵循領域驅動設計的原則。在領域驅動設計中有四個基本層:
- 表現層:提供用戶接口。使用應用層實現用戶交互。
- 應用層:橋接表現層和領域層。協調業務對象來執行特定的應用任務。
- 領域層:包括業務對象以及業務規則。此層是整個應用的核心。
- 基礎設施層:提供通用的技術能力來支持高層。基礎設施層可以是使用ORM框架與數據庫進行交互的一個倉儲實現,或者是一個發送郵件的郵件提供商的實現。
可能還會有按需添加的額外的層,如下:
- 分布式服務層:將應用程序的特征暴露給遠程客戶端。像ASP.NET Web API、WCF這樣的工具可以實現本層。
這些就是以領域驅動為中心架構的所有通用層。基於不用的實現可能會有微小的差別。
ASP.NET Boilerplate 架構
層級結構如下所示:
下面一個簡單的分層應用,一個有5個工程的解決方案:
一個層可以有一個或多個程序集實現。對於大工程,最好為第三方依賴(如EntityFramework)創建多個項目。而且,可以有限界上下文,在這裏每個上下文都有它自己的層。
領域層
所有的業務規則都應在領域層實現。
實體展現業務領域的數據和操作,通常來說實體會映射到實際的數據庫表。
倉儲是收集對象的地方,用來提取或持久化數據源(如數據庫)上的實體。領域層定義倉儲但是沒有實現。他們在基礎設施層實現。
領域事件用來定義特定的領域事件同時觸發並處理他們。領域服務使用實體(和其他的領域對象)工作用來實現不屬於一個實體的業務規則。
工作單元是一個設計模式用來管理數據庫連接和事務,跟蹤實體變化並且保存改變到數據存儲區。它定義在領域層,在基礎設施層實現。
此層應該盡可能的獨立於第三方類庫。
應用層
應用層包含應用服務,應用服務被展示層使用。應用服務方法可以接收DTO(數據傳輸對象)作為輸入,執行一些特定的領域層操作,如果需要,也可以返回另一個DTO。應用服務方法不應直接接收或返回實體。應用服務方法通常被認為是一個工作單元。用戶輸入驗證也在本層實現。建議使用工具類映射實體到DTO對象,如AutoMapper類庫。我們也在本層建立會話,並獲取當前用戶信息。
基礎設施層
領域層創建倉儲、工作單元和其他服務的接口,基礎設施層則實現這些接口。使用ORM工具如NHibernate或EntityFramework來實現倉庫。APS.NET Boilerplate提供基礎類來協作這兩個ORM框架。基礎設施層用來把其他層把對第三方庫的依賴抽象出來。數據庫遷移也可以在本層使用。
除了數據庫訪問,還有對服務提供者的抽象。例如,可以有一個發送SMS消息的提供者。可以在領域層或應用層定義一個接口以便從我們的代碼中抽象出來,然後我們可以在基礎設施層實現這個接口。
網絡、展示層
網絡層使用ASP.NET MVC、Web API和ASP.NET Core實現。有兩種不同的方法可以在這裏實現:單頁面應用和多頁面應用。啟動模板裏支持這兩種方式。
在單頁面應用裏,所有的資源都是一次(或者核心資源加載,其他資源是懶加載的)加載到客戶端的,其他的子請求都是用過AJAX調用實現的。客戶端使用從服務器接收的數據生成HTML代碼。整個頁面從不會刷新,視圖根據需要換入或換出。有很多的Javascript SPA框架,如Angularjs,Backbonejs和Emberjs。ASP.NET Boierplate 可以和任何一個協作,但是ABP提供了例子和一些幫助機制能夠更加容易的和Angular協作。
在多頁面應用裏,客戶端創建請求到服務端,服務端代碼(通常是ASP.NET MVC 控制器)從數據庫獲取數據,Razor視圖生成HTML。這些生成的頁面返回給客戶端顯示。每一個新的頁面請求都會導致整個頁面刷新。客戶端可以創建額外的AJAX請求以便有更好的用戶體驗。
SPA和MPA包含完全不同的架構。管理面板適合SPA,博客MPA更合適,因為博客希望被搜索引擎搜索到。有工具可以是SPA應用對搜索引擎可見, 通常的做法是這樣的。
SignalR是從服務端推送消息到客戶端的完美工具。它可以實現一個豐富的、即時的用戶體驗。
客戶端有許多的Javascript類庫和框架。在數千萬的免費插件中,jQuery是最流行的。同樣有工具或類庫可以更好的使用HTML和CSS。例如Twitter Bootstrap就是一個非常流行HTML/CSS框架。
ABP提供了基礎設施能夠從應用服務創建Web API層,並且很容易使用JavaScript訪問(參見文檔)。另外,提供了管理應用菜單、本地化和語言切換的基礎設施,還包含一個簡單、統一的Javascript API簡化顯示系統消息和通知。
ASP.NET Boilerplate自動在服務端處理異常並返回客戶端一個前檔的響應。
其他
ASP.NET通過Castle Windsor框架使用和支持依賴註入。使用Log4Net記錄服務端的日誌,在castle抽象日誌設施的幫助下可以在不改變代碼的情況下輕松更換為其他日誌記錄類庫。
總結
ASP.NET Boilerplate除了利用它自己的類庫和系統外還使用了其他一些最好的框架/類庫提供了一個創建N層架構應用的偉大基礎設施。它還有可以輕松創建分層解決方案的模板,以此可以作為我們應用的起點。
返回主目錄
ABP官方文檔翻譯 1.2 N層架構