ABP框架


1.1 ABP總體介紹 - 入門介紹

ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。

ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程序的新起點,它旨在成為一個通用的WEB應用程序基礎框架和項目模板。

ASP.NET Boilerplate 基於DDD的經典分層架構思想,實現了眾多DDD的概念(但沒有實現所有DDD的概念)。

ABP的官方網站:http://www.aspnetboilerplate.com

ABP在Github上的開源項目:https://github.com/aspnetboilerplate

ABP框架於2014年5月4日首次在Github開源,截止到2018年3月30日,總共進行了4582次代碼提交,163次版本發布,現在的版本號是3.5。 

1.1.1 ABP采用了以下技術

服務器端:

  • ASP.NET MVC 5、Web API 2、C# 5.0
  • DDD領域驅動設計 Entities、Repositories、Domain Services、Domain Events、Application Services、DTOs等) Castle windsor (依賴注入容器)
  • Entity Framework 6 \ NHibernate,數據遷移Log4Net(日志記錄)
  •  AutoMapper(實現Dto類與實體類的雙向自動轉換)

客戶端:

  • Bootstrap Less AngularJs jQuery Modernizr

  • 其他JS庫: jQuery.validate、jQuery.form、jQuery.blockUI、json2

1.1.2 ABP框架已實現了以下特性

  •  多語言/本地化支持

  • 多租戶支持(每個租戶的數據自動隔離,業務模塊開發者不需要在保存和查詢數時寫相應代碼)

  • 軟刪除支持(繼承相應的基類或實現相應接口,會自動實現軟刪除)

  • 統一的異常處理(應用層幾乎不需要處理自己寫異常處理代碼)

  • 數據有效性驗證(Asp.NET MVC只能做到Action方法的參數驗證,ABP實現了Application層方法的參數有效性驗證)

  • 日志記錄(自動記錄程序異常)

  • 模塊化開發(每個模塊有獨立的EF DbContext,可單獨指定數據庫)

  • Repository倉儲模式(已實現了Entity Framework、NHibernate、MangoDB、內存數據庫)

  • Unit Of Work工作單元模式(為應用層和倉儲層的方法自動實現數據庫事務)

  • EventBus實現領域事件﴾Domain Events﴿

  • DLL嵌入資源管理

  • 通過Application Services自動創建Web Api層(不需要寫ApiController層了)

  • 自動創建Javascript 的代理層來更方便使用Web Api

  • 封裝一些Javascript 函數,更方便地使用ajax、消息框、通知組件、忙狀態的遮罩層

“Zero”的模塊,實現了以下功能:

  • 身份驗證與授權管理(通過ASP.NET Identity實現的)

  • 用戶&角色管理

  • 系統設置存取管理(系統級、租戶級、用戶級,作用范圍自動管理)

  • 審計日志(自動記錄每一次接口的調用者和參數)

  在其他項目中的很多優秀設計,在ABP項目中也已存在,而且可能實現得更好。ABP框架的代碼,都通過xUnit進行了單元測 試。作者一直在用ABP框架開發他們的實際項目,從Github和他官方論壇上的信息可以看到,有很多國外的開發者在將ABP用 作生產項目的基礎框架。如果需要直接使用ABP組件,可以通過Nuget安裝(在VS的Nuget包管理界面搜索ABP)。 為了更好地將ABP適用於自己的項目,我對ABP的源碼做了一些修改后使用的,沒有直接使用ABP組件。 我希望更多國內的架構師能關注ABP這個項目,也許這其中有能幫助到你的地方,也許有你的參與,這個項目可以發展得更好。 今天只是作了一個大概介紹,希望有更多的朋友能去閱讀源代碼,然后參與討論。

1.1.3 ABP適用的場景

  中小規模WEB應用開發,可直接使用ABP框架。 較大型項目可以在ABP框架的源碼基礎上進行擴展,以實現分布式架構。

  注:處理高並發並不是ABP的強項。需要非常高並發的DDD框架,建議去研究netfocus的ENode。

1.2 ABP總體介紹 - 層架構體系

1.2.1 前言

為了減少復雜性和提高代碼的可重用性,采用分層架構是一種被廣泛接受的技術。

為了實現分層的體系結構,ABP遵循 DDD(領域驅動設計)的原則,將工程分為四個層:

  • 展現層(Presentation):向用戶提供一個接口﴾UI﴿,使用應用層來和用戶﴾UI﴿進行交互。

  • 應用層(Application):應用層是表現層和領域層能夠實現交互的中間者,協調業務對象去執行特定的應用任務

  • 領域層(Domain):包括業務對象和業務規則,這是應用程序的核心層。

  • 基礎設施層(Infrastructure):提供通用技術來支持更高的層。例如基礎設施層的倉儲﴾Repository﴿可通過ORM來實現數據庫交互,或者提供發送郵件的支持。

根據實際需要,可能會有額外添加的層。例如:

  • 分布式服務層(Distributed Service) :用於公開應用程序接口供遠程客戶端調用。比如通過ASP.NET Web API或WCF來實現。

這些都是常見的以領域為中心的分層體系結構。不同的項目在實現上可能會有細微的差別.

1.2.2 ABP的體系結構

層次結構概覽如下圖所示:

  一個簡單的解決方案,大致包含5個項目:

  一個層可以被實現為一個或者多個程序集。對於大項目的第三方依賴創建多個應用程序集這是一個好的選擇﴾例如:這里的 EntityFramework﴿。還有,在有限界上下文中,每個上下文都有它自己的分層。

1.2.3 領域層

領域層是實現所有業務規則的地方。

  • 實體(Entity): 實體代表業務領域的數據和操作,在實踐中,通常用來映射成數據庫表。

  • 倉儲(Repository): 倉儲是像集合一樣的對象,用來在數據源﴾數據庫﴿上檢索和存儲實體。在領域層定義倉儲,但是不實現它們。它們在基礎設施層被實現。

  • 領域服務(Domain service): 當處理的業務規則跨越兩個﴾及以上﴿實體時,應該寫在領域服務方法里面。

  • 領域事件(Domain Event): 領域事件被用來定義特定於領域的事件,並且觸發使用它們。領域服務與實體﴾以及其他領域對象﴿一起實現了不屬於單個實體的業務規則。

  • 工作單元(Unit of Work): 工作單元是一種設計模式被用來管理數據庫連接和事務,以及跟蹤實體更改,並將這些更改保存 到數據存儲中。它被定義在領域層中,但是在基礎設施層實現它們。

1.2.4 應用層

  應用層提供一些應用服務(Application Services)方法供展現層調用。一個應用服務方法接收一個DTO﴾數據傳輸對象﴿作為輸入 參數,使用這個輸入參數執行特定的領域層操作,並根據需要可返回另一個DTO。在展現層到領域層之間,不應該接收或返回 實體﴾Entity﴿對象,應該進行DTO映射。 一個應用服務方法通常被認為是一個工作單元(Unit of Work)。用戶輸入參數的驗證 工作也應該在應用層實現。ABP提供了一個基礎架構讓我們很容易地實現輸入參數有效性驗證。建議使用一種像AutoMapper這 樣的工具來進行實體與DTO之間的映射。

1.2.5 基礎設施層

  當在領域層中為定義了倉儲接口,應該在基礎設施層中實現這些接口。可以使用ORM工具,例如EntityFramework或 NHibernate。ABP的基類已經提供了對這兩種ORM工具的支持。數據庫遷移也被用於這一層。

1.2.6 WEB與展現層

  Web層使用ASP.NET MVC和Web API來實現。可分別用於多頁面應用程序﴾MPA﴿和單頁面應用程序﴾SPA﴿。 在SPA中,所有資源被一次加載到客戶端瀏覽器中(或者先只加載核心資源,其他資源懶加載),然后通過AJAX調用服務端 WebApi接口獲取數據,再根據數據生成HTML代碼。不會整個頁面刷新。現在已經有很多SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可以使用任何類似的前端框架,但是ABP提供了一些幫助類,讓我們更方便地使用 AngularJs和DurandalJs。 在經典的多頁面應用(MPA)中,客戶端向服務器端發出請求,服務器端代碼(ASP.NET MVC控制器)從數據庫獲得數據,並 且使用Razor視圖生成HTML。這些被生成后的HTML頁面被發送回客戶端顯示。每顯示一個新的頁面都會整頁刷新。 SPA和MPA涉及到完全不同的體系結構,也有不同的應用場景。一個管理后台適合用SPA,博客就更適合用MPA,因為它更利 於被搜索引擎抓取。 SignalR是一種從服務器到客戶端發送推送通知的完美工具。它能給用戶提供豐富的實時的體驗。 已經有很多客戶端的 Javascript框架或庫,JQuery是其中最流行的,並且它有成千上萬免費的插件。使用Bootstrap可以讓我們更輕松地完成寫Html 和CSS的工作。 ABP也實現了根據Web API接口自動創建 Javascript的代碼函數,來簡化JS對Web Api的調用。還有把服務器端的菜單、語言、 設置等生成到JS端。(但是在我自己的項目中,我是把這些自動生成功能關閉的,因為必要性不是很大,而這些又會比較影響 性能)。 ABP會自動處理服務器端返回的異常,並以友好的界面提示用戶。

1.2.7 其它

ABP使用Castle Windsor為整個程序框架提供依賴注入的功能。使用Log4Net日志記錄組件,提供給其他各層調用以進行日志記 錄。

1.3 ABP總體

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM