??不同的編程語言都有構建Web Application的框架,比如C#中的ASP.NET Core和ABP,Java中的Spring Boot和Spring Cloud,Python中的Django和Flask,Node.js中的Express和Koa2,Go中的Beego和Gin等。今天要介紹的主角是ABP框架,以前叫做ASP.NET Boilerplate,現在叫做ABP vNext,簡稱為ABP框架。ABP可以提供了構建現代Web Application的完整架構和強大的基礎設施,遵循DDD最佳實踐和約定。特別是完整的模塊化系統,能夠開發可重復使用的應用程序模塊,這一點對于軟件工程領域來說是非常重要的。總之,ABP是一個非常具有前瞻性的優秀框架。
一.ABP框架概述
在.NET領域中,通常使用ASP.NET Core來寫后端的Web API,ABP對其進行了無縫增強。在群里討論,用一位群友的話來說就是:ABP像變形金剛一樣,可以在單體和微服務項目之間切換;領域驅動設計[DDD]可以用的很重,也可以用的輕。根據項目情況,如果初期項目并不復雜,可以使用單體架構,隨著項目演化變的復雜了,也可以很容易的轉換為微服務架構,而DDD是復雜業務拆分的理論依據。簡單理解,微服務是從技術的視角來看拆分問題,而DDD是從業務視角來看拆分問題。從而解決項目的可維護和三高問題[高并發|高性能|高可用]。
1.ABP架構
(1)微服務兼容
核心框架和預構建模塊在設計時就考慮了微服務架構,因為很容易的在單體和微服務架構間轉換。
(2)模塊化架構
提供了完整的模塊化系統,能夠開發可重復使用的應用程序模塊。
(3)領域驅動設計
實現基于DDD的分層架構并構建可維護的代碼庫,幫助開發基于DDD模式和準則的應用程序。
(4)多租戶/Saas
提供了開箱即用的多租戶模塊,對于構建SaaS應用非常的方便。
2.ABP基礎設施
(1)認證與授權
集成了ASP.NET Core Identity和IdentityServer4豐富的身份驗證和授權選項,提供可擴展且詳細的權限系統。
(2)橫切關注點
Don't Repeat Yourself,專注于業務代碼,并讓ABP按照約定自動執行。
(3)分布式事件總線
使用帶有RabbitMQ集成的內置分布式事件總線,可以輕松發布和使用分布式事件。
(4)用戶界面主題
對于前后端不分離的項目,可以參考。但是對于前后端分離的項目,不用參考。
(5)數據過濾
自動過濾來自數據庫的查詢,以輕松實現軟刪除和多租戶等模式。
(6)Bootstrap Tag Helpers和動態表單
對于前后端不分離的項目,可以參考。但是對于前后端分離的項目,不用參考。
(7)審計日志
自動跟蹤系統中的所有操作和數據更改。
(8)HTTP APIs和動態代理
自動將應用程序服務公開為REST的HTTP API,并與動態JavaScript和C#代理一起使用。
3.ABP啟動模板
各種啟動模板提供了完整配置的解決方案,可以實現快速啟動開發:
4.ABP CLI
對ABP解決方案執行常見操作的命令行工具,安裝和更新ABP CLI:
dotnet tool install -g Volo.Abp.Cli
dotnet tool update -g Volo.Abp.Cli
ABP CLI所有可用的命令列表:
help:展示ABP CLI的用法幫助信息
new:生成基于ABP的啟動模板
update:自動更新的ABP解決方案ABP相關的NuGet和NPM包
clean:刪除當前目錄下所有的BIN和OBJ子目錄
add-package:添加ABP包到項目
add-module:添加應用模塊到解決方案
generate-proxy:生成客戶端代理以使用HTTP API端點
remove-proxy:移除以前生成的客戶端代理
switch-to-preview:切換到ABP框架的最新預覽版本
switch-to-nightly:切換解決方案所有ABP相關包為夜間構建版本
switch-to-stable:切換解決方案所有ABP相關包為最新的穩定版本
translate:當源代碼控制存儲庫中有多個JSON[本地化]
login:使用在abp.io的用戶名和密碼在計算機上認證
login-info:展示當前登錄用戶信息
logout:在計算機注銷認證
install-libs:為MVC/Razor Pages和Blazor Server UI類型安裝NPM包
二.ABP框架功能
(1)多個UI選項
Angular,MVC,Razor Pages,Blazor。
(2)多個數據庫提供程序
EF Core,MongoDB,Dapper。其中,Dapper支持不完善,坑多,最好還是用EF Core。
(3)ABP CLI
# Create a new layered application
abp new Acme.BookStore
# Create a new layered application using MongoDB
abp new Acme.BookStore -d mongodb
# Add a new module to the solution
abp add-module Volo.Blogging
(4)模塊化
ABP中使用模塊化的方法很簡單,就是繼承自AbpModule即可:
[DependsOn(typeof(AbpEntityFrameworkCoreModule), //Depending on a framework moduletypeof(MyBusinessModule) //Depending on your own module
)]
public class MyAppModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){//Configure DI and other modules...}public override void OnApplicationInitialization(ApplicationInitializationContext context){//Perform some application initialization logic...}
}
(5)多租戶
主要是將不同租戶間的數據進行隔離,ABP支持單一數據庫,或每個租戶單獨數據庫或者混合方式。
(6)Bootstrap標簽助手
使用ABP的tag helper來簡化它并利用智能感知:
<abp-card><img abp-card-image="Top" src="~/images/my-dog.png" /><abp-card-body><abp-card-title>Card title</abp-card-title><abp-card-text><p>This is a sample card component built by ABP bootstrapcard tag helper. ABP has tag helper wrappers for most ofthe bootstrap components.</p></abp-card-text><a abp-button="Primary" href="javascript:void(0)" >Go somewhere →</a></abp-card-body>
</abp-card>
輸出結果如下所示:(7)動態表單
動態表單和tag helpers可從作為模型的C#類創建完整的表單:
查看:
<abp-dynamic-form abp-model="@Model.PersonInput" submit-button="true" />
模型:
public class PersonModel
{[HiddenInput]public Guid Id { get; set; }[Required][EmailAddress][StringLength(255)]public string Email { get; set; }[Required][StringLength(32)][DataType(DataType.Password)]public string Password { get; set; }[StringLength(255)]public string Address { get; set; }public Gender Gender { get; set; }
}
結果:(8)認證與授權
主要是對ASP.NET Core Identity和IdentityServer4的繼承,基本上滿足身份驗證和授權,并且很容易擴展權限系統。
(9)橫切關注點
提供了授權、驗證、緩存、異常處理、數據庫連接和事務管理、審計日志、關聯ID跟蹤等常見的東西,可專注于業務代碼,并讓ABP按照約定自動執行即可。
(10)Bundling & Minification
ABP提供了一個簡單、動態、功能強大、模塊化的內置Bundling&Minification系統。
<abp-style-bundle name="MyGlobalBundle"><abp-style src="/libs/bootstrap/css/bootstrap.css" /><abp-style src="/libs/font-awesome/css/font-awesome.css" /><abp-style src="/libs/toastr/toastr.css" /><abp-style src="/styles/my-global-style.css" />
</abp-style-bundle>
(11)虛擬文件系統
虛擬文件系統使管理文件系統[磁盤]上不存在的文件成為可能,它主要用于將[js|css|image|cshtml...]文件嵌入到程序集中,并在運行時像物理文件一樣使用它們。
(12)主題
主題系統允許通過基于最新的Bootstrap框架定義一組通用基礎庫和布局來獨立開發應用程序和模塊主題。
(13)后臺作業
定義簡單的類以在隊列中在后臺執行作業,使用內置的作業管理器或集成自己的作業管理器。Hangfire&RabbitMQ集成已經可用:
public class EmailSendingJob : BackgroundJob<EmailSendingArgs>
{private readonly IEmailSender _emailSender;public EmailSendingJob(IEmailSender emailSender){_emailSender = emailSender;}public override void Execute(EmailSendingArgs args){_emailSender.Send(args.EmailAddress,args.Subject,args.Body);}
}
(14)DDD基礎設施
基于域驅動設計模式和準則構建分層應用程序的完整基礎設施,包括聚合根、實體、值對象、領域服務、倉儲、應用程序服務、數據傳輸對象、規范等:
public class BookAppService : ApplicationService, IBookAppService
{private readonly IRepository<Book, Guid> _bookRepository;public BookAppService(IRepository<Book, Guid> bookRepository){_bookRepository = bookRepository;}public async Task CreateAsync(CreateBookDto input){var book = new Book(GuidGenerator.Create(),input.Name,input.Type,input.Price);await _bookRepository.InsertAsync(book);}
}
(15)自動REST APIs
ABP可以按照約定自動將應用程序服務配置為API控制器:(16)動態客戶端代理
從JavaScript和C#客戶端輕松使用API:
//Call remote APIs just like local functions in JavaScript
acme.bookStore.book.getList({}).done(function (result) {//...});
(17)分布式事件總線
使用帶有RabbitMQ集成的內置分布式事件總線,可以輕松發布和使用分布式事件:
發布事件:
public class PublisherDemo : ITransientDependency
{private readonly IDistributedEventBus _distributedEventBus;public PublisherDemo(IDistributedEventBus distributedEventBus){_distributedEventBus = distributedEventBus;}public async Task RunAsync(){//Publish an eventawait _distributedEventBus.PublishAsync(new StockCountChangedEvent(productId, 42));}
}
處理事件:
public class MyEventHandler: IDistributedEventHandler<StockCountChangedEvent>{public Task HandleEventAsync(StockCountChangedEvent eventData){//Handle the event and execute your business}}
(18)BLOB存儲
BLOB存儲系統提供了BLOB的抽象,ABP提供了一些預構建的存儲提供程序集成[Azure|AWS|文件系統|數據庫等],可以輕松的在應用程序中使用它們:
public class MyService : ITransientDependency
{private readonly IBlobContainer _blobContainer;public MyService(IBlobContainer blobContainer){_blobContainer = blobContainer;}public async Task SaveBytesAsync(byte[] bytes){await _blobContainer.SaveAsync("my-blob", bytes);}public async Task<byte[]> GetBytesAsync(){return await _blobContainer.GetAllBytesOrNullAsync("my-blob");}
}
(19)文本模板
文本模板是基于模板和模型[數據對象]使用動態渲染內容。比如可以使用預構建的模板來創建動態的電子郵件內容:
var result = await _templateRenderer.RenderAsync("PasswordReset", //the template namenew PasswordResetModel{Name = "john",Link = "https://abp.io/example-link?userId=123&token=ABC"}
);
(20)測試基礎設施
框架已經考慮了單元和集成測試,提供基類使其更容易。啟動模板已預先配置用于測試:
public class MyService_Tests : AbpIntegratedTest<MyModule>
{private readonly MyService _myService;public MyService_Tests(){_myService = GetRequiredService<MyService>();}[Fact]public async Task MyService_Should_Do_It(){//Actvar result = _myService.DoIt();//Assertresult.ShouldBe(42);}
}
(21)審計日志
針對關鍵業務應用程序的內置審計日志記錄,請求、服務、方法級別的審計日志記錄以及具有屬性級別詳細信息的實體歷史記錄。
(22)對象映射
對象到對象映射抽象AutoMapper集成:
public class PersonService{//Inject IObjectMapperprivate readonly IObjectMapper _objectMapper;public PersonService(IObjectMapper objectMapper){_objectMapper = objectMapper;}public PersonDto GetPerson(Guid id){Person person = GetPersonEntityFromRepository(id);//Use for Entity to DTO mappingreturn _objectMapper.Map<Person, PersonDto>(person);}}
(23)電子郵件和短信抽象
IEmailSender和ISmsSender抽象使應用程序邏輯與基礎設施解耦。先進的電子郵件模板系統允許創建和本地化電子郵件模板,并在需要時輕松使用:
public async Task SendWelcomeEmailAsync(string emailAddress, string name)
{//Get the email templatevar template = await _emailTemplateProvider.GetAsync("WelcomeEmailTemplate");//Replace placeholderstemplate.Replace("name", name);//Send emailawait _emailSender.SendAsync(emailAddress,"Welcome to our application!",template.Content);
}
(24)本土化
本地化系統允許在純JSON文件中創建資源,并使用它們來本地化UI。它支持繼承、擴展和JavaScript集成等高級方案,同時與AspNetCore的本地化系統完全兼容:
{"culture": "en","texts": {"WelcomeMessage": "Welcome to the application!","HelloWorld": "Hello World"}
}
(25)設置管理
定義應用程序的設置,并根據當前配置,租戶和用戶在運行時獲取值。
(26)擴展方法
標準類型的擴展方法和助手使代碼更加清晰和易于編寫:
//Convert a string to camelCase
"HelloWorld".ToCamelCase(); //returns "helloWorld"//Truncate a string with "..." postfix
"This is a test string".TruncateWithPostfix(12); //returns "This is a..."//Convert a string to int
"42".To<int>(); //returns 42 as int//Check if a value occurs in a list
5.IsIn(1, 3, 5, 7); //returns true//Check if a value is between a range
5.IsBetween(6, 12); //returns false
(27)面向切面的編程
提供合適的基礎設施來創建動態代理并實現面向切面的編程,攔截任何類,并在每次方法執行之前和之后執行代碼:
//Inherit from the AbpInterceptor to log all method executions
public class MyLoggingInterceptor : AbpInterceptor, ITransientDependency
{private readonly ILogger<MyLoggingInterceptor> _logger;public MyLoggingInterceptor(ILogger<MyLoggingInterceptor> logger){_logger = logger;}public async override Task InterceptAsync(IAbpMethodInvocation invocation){LogInvocation(invocation);await invocation.ProceedAsync();}private void LogInvocation(IAbpMethodInvocation invocation){/* Access to all the information about the method execution* including method, class and provided arguments */_logger.LogInformation("Executing the method: " +invocation.Method.Name +" of class " +invocation.TargetObject.GetType().FullName);}
}
(28)依賴注入
無需手動注冊類以進行依賴項注入,按照約定自動注冊常用服務類型。對于其它類型的服務,可以使用接口和屬性來使其變得更方便:
/* Automatically registers MyService as transient.* Then you can inject by IMyService or MyService.*/
public class MyService : IMyService, ITransientDependency
{
}
(29)數據過濾
定義和使用數據過濾器,這些過濾器在從數據庫中查詢實體時會自動應用。當實現簡單的接口時,可立即使用軟刪除功能和多租戶過濾器:
public class MyEntity : Entity<Guid>, ISoftDelete
{public bool IsDeleted { get; set; }
}
三.ABP項目工程
只是介紹3種項目類型的結果,具體代碼另寫一篇文章介紹:
1.項目類型-應用程序[分層]

2.項目類型-應用程序[單層]
以前是沒有單層項目的,可能大家在構建中小型Web Application時發現使用分層的應用程序還是太重量級了,官方后來就添加了單層項目:
3.項目類型-模塊
查了下ABP官網,推測AbpModule.Web.Unified項目是AbpModule.HttpApi.Host和AbpModule.Web.Host的結合體:
四.ABP項目資料
1.ABP官方文檔
由于ABP發展速度,因此資料很少,網上找的資料基本上過時了。ABP官方文檔應該是最新的、最全的學習資料了:
2.ABP GitHub
通過ABP GitHub可以研究框架模塊和應用程序模塊的具體實現原理。框架模塊:這些是框架的核心模塊,像緩存、郵件、主題、安全性、序列化、驗證、Ef Core集成、MongoDB集成等等,它們沒有應用程序/業務功能,但通過提供通用基礎架構,集成和抽象會使日常開發更加容易。應用程序模塊:這些模塊是實現特定的應用程序/業務功能,像博客、文檔管理、身份管理、租戶管理等等,它是通常有自己的實體、服務、API和UI組件。開源的應用程序模塊如下所示:(1)Audit Logging:用于將審計日志持久化到數據庫
(2)Background Jobs:用于在使用默認后臺作業管理器時保存后臺作業
(3)Blogging:用于創建精美的博客,ABP的博客就使用了此模塊
(4)Docs:用于創建技術文檔頁面,ABP的文檔就使用了此模塊
(5)Feature Management:用于保存和管理功能
(6)Identity:基于Microsoft Identity管理組織單元、角色、用戶和它們的權限
(7)Identity Server:集成了IdentityServer4
(8)Permission Management:用于保存權限
(9)Setting Management:用于保存設置
(10)Tenant Management:管理多租戶應用程序的租戶
(11)Users:抽象用戶,因此其它模塊可以依賴此模塊而不是Identity模塊
(12)Virtual File Explorer:提供簡單的UI查看虛擬文件系統中的文件
3.EasyAbp GitHub
尤其值得一提的是AbpHelper.GUI和 AbpHelper.CLI這2個項目,相當于是ABP Suite。作為低代碼工具,如果使用得當可以提交開發效率。另外要介紹的是awesome-abp倉儲,這里面應該是目前最全的ABP學習資料了:
4.ABP書籍
目前(1)既有英文版還有中文版,但是(2)只有英文版。下載方式詳見文檔底部:
(1)《Implementing Domain Driven Design》
(2)《Mastering ABP Framework》
五.ABP商業版本
ABP商業版預建應用程序模塊、高級啟動模板、快速應用程序開發工具、專業UI主題和高級支持等。其中,預建應用程序模塊包括Account、Audit Logging、Identity、Identity Server UI、Language Management、SaaS、Lepton Theme、Payment、Text Template Management、Chat、File Management、CMS Kit、Forms、GDPR、Twilio SMS、Blogging、Docs等。初次之外,值得一提的是ABP Suite,相當于是一個低代碼工具,可以加速CRUD開發。
1.首頁

2.儀表板

3.文件管理

4.SaaS
4.1租戶

4.2版本

5.管理
5.1身份標識管理
(1)組織機構(2)角色
(3)用戶
(4)聲明類型
(5)安全日志
5.2Identity Server
(1)客戶端(2)Identity資源
(3)Api資源
(4)Api Scope
5.3語言管理
(1)語言[官網打不開]
(2)語言文本[官網打不開]
5.4文本模板

5.5審計日志

5.6設置
(1)身份標識管理(2)Lepton主題
(3)賬戶-通用
(4)賬戶-雙因素
(5)賬戶-驗證碼
除了ABP官方商業版外,還有非官方的商業版,比如52ABP,感興趣可以了解下。
資料下載區
1.Implementing Domain Driven Design:公眾號后臺回復:2
2.基于ABP Framework實現領域驅動設計:公眾號后臺回復:3
3.Mastering ABP Framework:公眾號后臺回復:4
或者
1.Implementing Domain Driven Design: https://url39.ctfile.com/f/2501739-610635606-674948?p=2096(訪問密碼:2096)
2.基于ABP Framework實現領域驅動設計: https://url39.ctfile.com/f/2501739-610635608-94e753?p=2096(訪問密碼:2096)
3.Mastering ABP Framework: https://url39.ctfile.com/f/2501739-610635610-9a8f66?p=2096(訪問密碼:2096)
參考文獻:
[1]ABP官方網站:https://abp.io/
[2]Mastering ABP Framework:https://abp.io/books/mastering-abp-framework
[3]實現領域驅動設計:https://abp.io/books/implementing-domain-driven-design
[4]ABP文檔:https://docs.abp.io/zh-Hans/abp/latest/
[5]ABP社區:https://community.abp.io/
[6]ABP Commercial Documentation:https://docs.abp.io/en/commercial/latest
人工智能干貨推薦專注于人工智能領域的技術分享
游戲元宇宙專注于游戲領域的技術分享