Abp vNext
简介
Abp vNext 是Abp新开源项目和原来的 Abp 是分开单独的项目,之所以新开是因为现在的这个版本是纯洁.Net Core版本、完全模块化的版本,现在最新版本是V3.0.4,源码在 github.com。其实现在我们将Abp 基本都是讲的Abp vNext.
他比以前的版本更精致,颗粒更小,开发者的选择跟多!虽然他是集成了许多种最佳实践的套件,但是他每一个小的模块功能都是能单独拿来使用的!
而且现在更新的频率也很高,所有的bug、建议、问题很快得到响应,让这个项目成长的跟快,更成熟!
当然新项目也是支持多租户的,不同租户的数据相互隔离,进行编码的时候完全感受不到多租户的存在。
具体的在官网有详细介绍 特点 下面简单罗列下
特点
- 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
- 模块化 & 微服务兼容 (.Net Core 本来就是一个模块的设计思路)
这里简单说下 模块是偏向逻辑和抽象的一个东西,而组件是一个偏实现的东西。怎么说呢?
一个dll是个组件,Java里就是一个jar包;比如微信功能做一个模块,这个微信模块里面可能就用了很多个组件
继承AbpModule就可以写自己的模块了
public class BlogModule : AbpModule
{
}
- 实现大部分日常需要的横向功能 如:授权、验证、异常、缓存、审计日志、事务管理等等
- 多租户
- 虚拟文件系统
- DDD 领域驱动设计
- 支持替换 DI (ABP vNext 默认使用的是 Autofac 有些高级应用需要,建议就用默认)
- Http Apis & 动态代理
- 主题皮肤的支持
-
文档是有中文的
当然建议看英文的,因为是翻译,翻译就有好有坏嘛
简单总结:
-
快
快速搭建
-
稳
从.NET Framework 开始很多年的沉淀,单元测试覆盖全面
-
全
如果你的开发团队在100人一下,我觉得如果自己去找轮子的话,费时费力不说而且很有可能还没有Abp做的更全面还坚固扩展性、灵活性,以及他由单体转微服务的话都不用做代码迁移!
学习质料
- 官网 https://abp.io/
- 文档 https://docs.abp.io/zh-Hans/abp/latest/
- 源码 https://github.com/abpframework/abp/
- 国内团队打造的Abp模块开发项目,现在有很多如 微信、cms、商城、各种Sdk 等等的实现 https://github.com/EasyAbp
其实Abp的基础知识不用过多的研究,他都是Core的一些封装抽象,多实践,加上阅读源码就可以了。
难点和重点是模块开发、Api动态代理、DDD、数据访问这些点。
这是个实战系列就不过多讨论理论的东西了,现在直接到主题就是实践。
环境
IDE随意,vscode、Visual Studio、vim 这里说的是这个系列我这里的环境:
- Windows 10
- .Net Core 3.1
- Visual Studio 2019 版本16.6.4
- Microsoft Edge 基于 Chromium ,完全不必担心用Google Chrome 是一样的,个人觉得Edge好用
- Windows Terminal 用这个把CMD换掉吧,又好看又好用!
开始
新建项目的方式
第一种:vs 建项目,手动添加项目和 Abp 的 Nuget
第二种:Create New Project 点开:选择 Direct Download 这个Tab,填完项目名称等后 点击 Create now 就会把创建好的项目下载下来了
第三种:推荐这种方式 CLI 命令行创建
- 安装Abp CLI 工具
#安装
dotnet tool install -g Volo.Abp.Cli
#更新升级
dotnet tool update -g Volo.Abp.Cli
创建项目
Abp 项目有三种 Application、Module、Console 我们这里先做一个完整的项目选择Application 他们各种的 用途 在这里有解释。可以先简单理解:Application 是一个完整的带Web的项目; Module 开发模块,服务的项目;Console 就是控制台程序。
使用第二和第三种创建方式都会生成一样的文件:
这里以项目名 CLI形式、DG.Blog项目名 为例
PS C:\Users\huang\OneDrive\doc\abp> abp new DG.Blog
[16:41:24 INF] ABP CLI (https://abp.io)
[16:41:25 INF] Version 3.0.4 (Stable channel)
[16:41:26 INF] Creating your project...
[16:41:26 INF] Project name: DG.Blog
[16:41:26 INF] Mobile App: ReactNative
[16:41:26 INF] Output folder: C:\Users\huang\OneDrive\doc\abp\DG.Blog
[16:41:30 INF] Using cached template: app, version: 3.0.4
[16:41:32 INF] Check out the documents at https://docs.abp.io/en/abp/latest/Startup-Templates/Application
[16:41:34 INF] 'DG.Blog' has been successfully created to 'C:\Users\huang\OneDrive\doc\abp\DG.Blog'
生成successfully了,打开目录看下有两个文件夹:
aspnet-core 和 react-native
react-native 是移动端的我们主要看aspnet-core这个文件夹:
│ .gitattributes
│ .gitignore
│ common.props
│ DG.Blog.sln
│ DG.Blog.sln.DotSettings
├───src
│ ├───DG.Blog.Application
│ ├───DG.Blog.Application.Contracts
│ ├───DG.Blog.DbMigrator
│ ├───DG.Blog.Domain
│ ├───DG.Blog.Domain.Shared
│ ├───DG.Blog.EntityFrameworkCore
│ ├───DG.Blog.EntityFrameworkCore.DbMigrations
│ ├───DG.Blog.HttpApi
│ ├───DG.Blog.HttpApi.Client
│ └───DG.Blog.Web
└───test
├───DG.Blog.Application.Tests
├───DG.Blog.Domain.Tests
├───DG.Blog.EntityFrameworkCore.Tests
├───DG.Blog.HttpApi.Client.ConsoleTestApp
├───DG.Blog.TestBase
└───DG.Blog.Web.Tests
VS 打开 DG.Blog.sln
打开是这样的
项目分层就可以看出是按照DDD来分的
-
Domain.Shared 项目
解决方案的领域层. 它主要包含 实体, 集合根, 领域服务, 值类型, 仓储接口 和解决方案的其他领域对象.
实体和 Repository 接口都放在这个项目中.
依赖 Domain.Shared 项目,因为项目中会用到它的一些常量,枚举和定义其他对象.
-
Application 项目
项目包含 Application.Contracts 项目的 应用服务 接口实现.
依赖 Application.Contracts 项目,需要实现接口与使用DTO.
依赖 Domain 项目,使用领域对象(实体,仓储接口等)执行应用程序逻辑.
-
Application.Contracts 项目
项目包含 应用服务 接口、应用层的DTO. 它用于分离应用层的接口和实现. 这样就可以把契约共享出去成为系统的标准.
依赖 Domain.Shared 因为会在应用接口和DTO中使用常量,枚举和其他的共享对象。
-
EntityFrameworkCore 项目
集成EF Core的项目. 定义DbContext 和实现Domain 项目中定义的仓储接口.
依赖 Domain 项目,引用实体和仓储接口.
我们这里都是默认配置生成的(abp new DG.Blog),所以有EF Core,他不是必须或一定出现的项目
-
EntityFrameworkCore.DbMigrations 项目
EF Core数据库迁移. 独立的 DbContext (仅用于数据库迁移)进行迁移动作.
依赖 .EntityFrameworkCore 项目,用应用程序的 DbContext 配置
-
DbMigrator 项目
控制台应用程序,有单独的 appsettings.json 文件. 记得配置更改.
依赖 EntityFrameworkCore.DbMigrations 项目 访问迁移文件.
依赖 Application.Contracts 项目.
-
HttpApi 项目
定义API控制器.(Abp会自动动态创建,有需要另外实现的可在此项目中实现)
依赖 Application.Contracts 项目,注入应用服务接口.
-
HttpApi.Client 项目
客户端代理使用的HTTP API项目.
ABP动态 C# API 客户端功能,你不需要手动的创建C#客户端代理,除非你有单独的需求.
依赖 .Application.Contracts 项目,使用应用服务接口和DTO.
-
Web 项目
用户界面(UI).ASP.NET Core MVC UI, 或者Angular
依赖 HttpApi 项目,使用API和应用服务接口
-
Test 项目
这个自然是测试
下一章 我们开始配置数据库,迁移,让这个项目跑起来!