ABP vNext 是 ASP.NET Boilerplate 的下一代 Web 应用框架(详见博客Introducing the ABP vNext),它具有完整的架构和强大的基础设施用于快速开发现代化的 Web 应用。遵循最佳实践与惯例可以为你提供一个一致的(SOLID )开发体验。
新建一个 ABP 应用有两种方式:基于启动模板,或者从空项目开始。本文总结创建基于启动模板的解决方案,并说明每个项目的作用。
话不多说,我们马上开始创建第一个 ABP vNext 应用吧。
安装 ABP CLI 命令
dotnet tool install -g Volo.Abp.Cli
执行成功后就可以执行 abp new 命令创建指定模板的解决方案。
macOS 下利用 zsh 安装后,可能会提示
zsh: command not found: abp,解决办法如下:编辑
~/.zshrc,将~/.dotnet/tools添加到PATH 中:
export PATH=$HOME/.dotnet/tools:$PATH
解决方案结构
默认结构
如果不指定UI 框架,或未指定--tiered选项,则默认创建一个 ASP.NET Core MVC Razor Pages 项目:
abp new LearnAbp.BookStore
等价于:
abp new LearnAbp.BookStore -u app

项目依赖图

.Domain.Shared
共享层。
包含常量、枚举和其它对象,它们是领域层的一部分。
该项目不引用任何其它项目,但是被所有其它项目直接或间接引用。
.Domain
领域层。
主要包含实体(entities)、聚合根(aggregate roots)、领域服务(domain services)、值类型(value types)、仓库接口(repositories interfaces)和其它领域对象。
.Application.Contracts
应用契约(接口)层。
主要包含应用服务(application services)接口和 应用层的DTO(Data Transfer Object)类。
它存在作用是分离应用层的接口和实现,因此它能作为一个契约包分享给客户端。
例如: IBookAppService和BookCreationDto
依赖关系:
- 依赖
.Domain.Shared,因为它可能使用常量、枚举和其它共享对象。
.Application
应用层。
包含定义在.Application.Contracts中的接口的实现。
例如:BookAppService实现接口IBookAppService,并依赖.Domain项目来使用实体和领域对象来执行业务逻辑。
.EntityFrameworkCore
集成 EF Core。
定义 DbContext 并实现定义在 .Domain 中的仓库接口。
只有当使用 EF Core 作为数据提供者的时候,该项目才有用。如果数据源用的是 MongoDB、Dapper 等等,该项目的名字和实现也会不同。
.EntityFrameworkCore.DbMigrations
EF Core 数据库迁移层。
它有一个单独的DbContext专门用于管理迁移。
ABP 是一个具有理想设计的模块化框架,每个模块(module)有它自己的DbContext类。基于此,用于迁移的DbContext把所有DbContext配置整合到一个单独的 model 里来维护同一个数据库结构。
在高级场景中,我们可以有多个数据库和多个迁移DbContext类。
注意:
迁移
DbContext仅用作数据库迁移,而不会在程序运行时调用。
依赖关系:
- 依赖
.EntityFrameworkCore,因为它重用应用程序里为DbContext定义的通用配置。
.DbMigrator
控制台程序,用来简化在开发和生产环境的数据库迁移。
它做了以下几件事:
- 在必要时创建数据库
- 应用还未生效的迁移更改
- 需要时填充种子数据
特别地,填充种子数据在这里很重要。ABP 框架具有模块化的架构去填充种子数据,详细可以查看文档。
该程序不仅可用于关系型数据库,也可用于为 NoSQL 数据库填充种子数据。
依赖关系:
-
依赖
.EntityFrameworkCore.DbMigrations并访问定义其中的迁移 -
依赖
.Application.Contracts因此可以访问权限定义,默认授权 admin 所有权限
.HttpApi
自定义 API Controller。
大多时候我们不需要定义API Controller,因为 ABP 框架 Auto API Controller特性会基于应用程序分层自动创建它们。
依赖关系:
- 依赖
.Application.Contracts以注入应用服务接口。
.HttpApi.Client
C#客户端代理,用来访问解决方案里的 HTTP API,并可以分享给第三方客户,为他们访问 HTTP API 提供方便。
由于Dynamic C# API Clients,大多时候我们无需手动创建C#客户端代理。
.HttpApi.Client.ConsoleTestApp项目演示如何使用这个客户端代理。
依赖关系:
- 依赖
.Application.Contracts以共享远程服务使用的接口和 DTO 类。
不需要的话可以删掉该项目。
.Web
该项目是 ASP.NET Core MVC UI 层,包含Razor Pages,JavaScript 文件,CSS 文件等等。
该项目包含主要的appsettings.json文件,包含数据库连接字符串以及其它程序配置项。
依赖关系:
- 依赖
.HttpApi,因为UI 层需要使用 API和应用程序接口。
该项目引用了
.Application和.EntityFrameworkCore.DbMigrations两个项目,而实际上这两个引用在 UI 层是不需要的,因为 UI 通常并不依赖于 EF Core 和 Application 层的实现。这是由于创建解决方案时没有指定
--tiered选项,因此.Web项目在单个服务里托管 UI,API和应用层。总的来说,这种结构不符合 DDD 最佳实践,应该在展示层可以直接使用Domain Entity和仓储。
接下来看分层结构。
分层结构
abp new LearnAbp.BookStore --tiered
创建的解决方案如下图:

指定--tiered选项创建的是一个前后端分离的解决方案,并且多出两个项目.IdentityServer和.HttpApi.Host。
.IdentityServer
作为认证服务器被其它项目使用。
.Web项目通过 OpenId Connect Authentication 从 IdentityServer 为当前用户获取 ID 和 access token,然后使用access token 去调用 HTTP API 服务。HTTP API 服务使用 bearer token 认证方式从 access token 中提取声明以授权当前用户。

ABP 使用开源的 IdentityServer4 框架在应用程序之间做认证,具体看IdentityServer4 文档 了解IdentityServer4 和 OpenID Connect 协议。
.HttpApi.Host
托管 HTTP API。
它有自己的appsettings.json来存放数据库连接和其它配置。
.Web
托管 UI,和默认结构里的一样。
不过这个.Web的appsettings.json不再需要连接数据库的配置,而是存放远程 API 和认证服务的地址。
如何运行?
- 启动
.IdentityServer,因为其他程序依赖它 - 启动
.HttpApi.Host,因为它被.Web调用 - 启动
.Web并登入系统
Angular UI
如果选择 Angular 作为 UI 框架
abp new LearnAbp.BookStore -u angular
解决方案会被分成三个文件夹:
angular包含 Angular UI 程序,作为前端代码aspnet-core包含 ASP.NET Core 解决方案,作为服务的代码react-native包含 React Native UI 程序,作为移动端的前端代码
服务端代码和上面介绍的类似,不过不再有.Web项目。*.HttpApi.Host项目托管 HTTP API, Angular调用它。
项目结构详细说明,可参考官方文档: Angular UI
ABPvNext是一个现代化Web应用框架,用于快速开发。本文介绍了如何使用ABPCLI创建项目,包括默认和分层结构。默认结构包含ASP.NET Core MVC Razor Pages项目,而分层结构则前后端分离,增加了.IdentityServer和.HttpApi.Host项目。.IdentityServer处理认证,.HttpApi.Host托管HTTPAPI,.Web项目负责UI。创建项目时,可以选择--tiered选项以遵循DDD最佳实践。
&spm=1001.2101.3001.5002&articleId=120751494&d=1&t=3&u=7b0cfd183bd1435d8a6a0dd5dffc3e8f)
3290

被折叠的 条评论
为什么被折叠?



