在上一篇文章《手把手教你用Abp vnext构建API接口服务》中,咱们用ABP vnext实现了WebAPI接口服务,可是并不是ABP模块化架构的最佳实践。我自己也在学习ABP,我认为ABP新手应该从最佳实践开始学习,能够少走不少弯路,因此写了这篇最佳实践来作个总结,同时给其余朋友们提供一点参考。html
ABP是一个包含许多nuget包的模块化框架。它提供了一个完整的基础架构来开发你本身的具备实体、服务、数据库集成、API、 UI组件等等功能的应用程序模块。
模块化架构的最佳实践就是按功能的划分建立相应的模块实现的服务,必要时能够把模块发布到nuget,由其余模块安装组合成新的服务或单体应用。这样就能够复用现有的模块功能,快速的交付产品,告别996。mysql
这部份内容所有来自于模块化架构最佳实践 & 约定,有兴趣的朋友能够去官方文档查看。若是已经很熟悉ABP分层了,能够直接阅读第三部分。git
将领域层划分为两个项目:github
将应用服务层划分为两个项目:web
建立命名为CompanyName.ModuleName.Web的Web包。 包含页面、视图、脚本、样式、图像和其余UI组件。Web包仅依赖于HttpApi包。sql
开发环境:Mac Visual Studio Code
SDK:dotnet core 3.1
数据库:PostgreSQL数据库
在上一篇文章中引入的是Volo.Abp.Identity的包,如今改用Volo.Abp.DDD的包,更简洁。api
/**建立解决方案**/ dotnet new sln /**建立模块分层**/ dotnet new classlib -o src/Lemon.Account.Domain.Shared dotnet new classlib -o src/Lemon.Account.Domain dotnet new classlib -o src/Lemon.Account.EntityFrameworkCore dotnet new classlib -o src/Lemon.Account.EntityFrameworkCore.DbMigrations dotnet new classlib -o src/Lemon.Account.Application.Contracts dotnet new classlib -o src/Lemon.Account.Application dotnet new classlib -o src/Lemon.Account.HttpApi dotnet new classlib -o src/Lemon.Account.HttpApi.Client dotnet new web -o src/Lemon.Account.Host /**加入解决方案**/ dotnet sln Lemon.Account.sln add src/Lemon.Account.Domain.Shared dotnet sln Lemon.Account.sln add src/Lemon.Account.Domain dotnet sln Lemon.Account.sln add src/Lemon.Account.EntityFrameworkCore dotnet sln Lemon.Account.sln add src/Lemon.Account.EntityFrameworkCore.DbMigrations dotnet sln Lemon.Account.sln add src/Lemon.Account.Application.Contracts dotnet sln Lemon.Account.sln add src/Lemon.Account.Application dotnet sln Lemon.Account.sln add src/Lemon.Account.HttpApi dotnet sln Lemon.Account.sln add src/Lemon.Account.HttpApi.Client dotnet sln Lemon.Account.sln add src/Lemon.Account.Host /**分层间互相引用**/ dotnet add src/Lemon.Account.Domain/Lemon.Account.Domain.csproj reference src/Lemon.Account.Domain.Shared/Lemon.Account.Domain.Shared.csproj dotnet add src/Lemon.Account.EntityFrameworkCore/Lemon.Account.EntityFrameworkCore.csproj reference src/Lemon.Account.Domain/Lemon.Account.Domain.csproj dotnet add src/Lemon.Account.EntityFrameworkCore.DbMigrations/Lemon.Account.EntityFrameworkCore.DbMigrations.csproj reference src/Lemon.Account.EntityFrameworkCore/Lemon.Account.EntityFrameworkCore.csproj dotnet add src/Lemon.Account.Application/Lemon.Account.Application.csproj reference src/Lemon.Account.Application.Contracts/Lemon.Account.Application.Contracts.csproj dotnet add src/Lemon.Account.Application/Lemon.Account.Application.csproj reference src/Lemon.Account.Domain/Lemon.Account.Domain.csproj dotnet add src/Lemon.Account.HttpApi/Lemon.Account.HttpApi.csproj reference src/Lemon.Account.Application.Contracts/Lemon.Account.Application.Contracts.csproj dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj reference src/Lemon.Account.EntityFrameworkCore.DbMigrations/Lemon.Account.EntityFrameworkCore.DbMigrations.csproj dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj reference src/Lemon.Account.Application/Lemon.Account.Application.csproj dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj reference src/Lemon.Account.HttpApi/Lemon.Account.HttpApi.csproj /**添加nuget依赖包**/ dotnet add src/Lemon.Account.Domain.Shared/Lemon.Account.Domain.Shared.csproj package Volo.Abp.Validation dotnet add src/Lemon.Account.Domain/Lemon.Account.Domain.csproj package Volo.Abp.Ddd.Domain dotnet add src/Lemon.Account.Domain/Lemon.Account.Domain.csproj package Lemon.Common dotnet add src/Lemon.Account.EntityFrameworkCore/Lemon.Account.EntityFrameworkCore.csproj package Volo.Abp.EntityFrameworkCore dotnet add src/Lemon.Account.EntityFrameworkCore/Lemon.Account.EntityFrameworkCore.csproj package Volo.Abp.EntityFrameworkCore.PostgreSql dotnet add src/Lemon.Account.EntityFrameworkCore.DbMigrations/Lemon.Account.EntityFrameworkCore.DbMigrations.csproj package Volo.Abp.EntityFrameworkCore dotnet add src/Lemon.Account.EntityFrameworkCore.DbMigrations/Lemon.Account.EntityFrameworkCore.DbMigrations.csproj package Volo.Abp.EntityFrameworkCore.PostgreSql dotnet add src/Lemon.Account.EntityFrameworkCore.DbMigrations/Lemon.Account.EntityFrameworkCore.DbMigrations.csproj package Microsoft.EntityFrameworkCore.Design dotnet add src/Lemon.Account.Application.Contracts/Lemon.Account.Application.Contracts.csproj package IdentityModel dotnet add src/Lemon.Account.Application.Contracts/Lemon.Account.Application.Contracts.csproj package Volo.Abp.Ddd.Application.Contracts dotnet add src/Lemon.Account.Application/Lemon.Account.Application.csproj package Volo.Abp.Ddd.Application dotnet add src/Lemon.Account.Application/Lemon.Account.Application.csproj package Volo.Abp.AutoMapper dotnet add src/Lemon.Account.HttpApi/Lemon.Account.HttpApi.csproj package Volo.Abp.AspNetCore.Mvc dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Volo.Abp.AspNetCore.Mvc dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Swashbuckle.AspNetCore dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Microsoft.AspNetCore.DataProtection.StackExchangeRedis dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Microsoft.Extensions.Caching.StackExchangeRedis dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Serilog.AspNetCore dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Serilog.Settings.Configuration dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Serilog.Sinks.Async dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Serilog.Sinks.File dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Volo.Abp.AspNetCore.Serilog dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package Volo.Abp.Autofac dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj package IdentityServer4.AccessTokenValidation dotnet add src/Lemon.Account.Host/Lemon.Account.Host.csproj reference src/Lemon.Account.EntityFrameworkCore.DbMigrations/Lemon.Account.EntityFrameworkCore.DbMigrations.csproj
在Domain建立实体类及其约束关联,具体代码请看UserData类,此处再也不详细说明。浏览器
在EntityFrameworkCore建立AccountDbContext类和LemonAccountDbContextModelCreatingExtensions类。请特别关注LemonAccountDbContextModelCreatingExtensions类,主要是用来定义实体在数据库表中的字段属性。安全
进入Host目录,执行命令
dotnet watch run
服务启动成功,在浏览器打开连接http://localhost:5000/swagger/index.html,开始调试帐号注册和验证接口。结果以下:
使用模块化架构的好处有几点:
dotnet new classlib -o src/Lemon.Account.EntityFrameworkCore.MySQL dotnet new classlib -o src/Lemon.Account.EntityFrameworkCore.MySQL.DbMigrations dotnet sln Lemon.Account.sln add src/Lemon.Account.EntityFrameworkCore.MySQL dotnet sln Lemon.Account.sln add src/Lemon.Account.EntityFrameworkCore.MySQL.DbMigrations dotnet add src/Lemon.Account.EntityFrameworkCore.MySQL/Lemon.Account.EntityFrameworkCore.MySQL.csproj reference src/Lemon.Account.Domain/Lemon.Account.Domain.csproj dotnet add src/Lemon.Account.EntityFrameworkCore.MySQL.DbMigrations/Lemon.Account.EntityFrameworkCore.MySQL.DbMigrations.csproj reference src/Lemon.Account.EntityFrameworkCore.MySQL/Lemon.Account.EntityFrameworkCore.MySQL.csproj dotnet add src/Lemon.Account.EntityFrameworkCore.MySQL/Lemon.Account.EntityFrameworkCore.MySQL.csproj package Volo.Abp.EntityFrameworkCore.MySQL dotnet add src/Lemon.Account.EntityFrameworkCore.MySQL.DbMigrations/Lemon.Account.EntityFrameworkCore.MySQL.DbMigrations.csproj package Microsoft.EntityFrameworkCore.Design
最后再修改ConnectionStrings default为mysql的链接,修改LemonAccountHostModule的依赖项LemonAccountEntityFrameworkCoreDbMigrationsModule为MySQL
单体应用和微服务无缝切换
模块开发完成后,通常看成微服务来部署;或者把模块发布到nuget,在单体应用的各个分层中引入模块,多个模块在单体应用中的应用就构成了一个完整系统服务。
模块复用
因为模块是发布到nuget的,因此若是有新的项目须要用到相同功能的,能够直接从nuget引入安装,无需重复开发或者复制代码。
自动API控制器
动态 C# API 客户端
GiHub地址:https://github.com/huangbenq/abp-samples
参考文档: