bp VNext 入门——让ABP跑起来
因好多群友@我说,ABP他们简单的了解了下,按照官方的教程一路下来跑不起来(倒在了入门的门口),才有了此文。
此文结合官方文档,一步一步带领大家让ABP跑起来(跨过门口)。
建议大家一步一步实际动手操作下
一、Abp 简介
ABP是用于创建现代Web应用程序的完整架构和强大的基础设施! 遵循最佳实践和约定,为你提供SOLID开发经验.
ABP 是一个开源应用程序框架,专注于基于ASP.NET Core的Web应用程序开发,但也支持开发其他类型的应用程序.
二、项目创建
作为入门,这里就不使用CLI创建了,使用在线创建项目,在线地址:https://abp.io/get-started,为了演示,项目名称就用官方的Acme.BookStore
下载完解压后,使用VS2019 打开后
下面我将带领大家搭建一个简单的CURD,并简单的带大家认识它的分层及各层是干啥的。
三、开发教程
3.1、在 Acme.BookStore.Domain.Share 层下创建 BookType 枚举
public enum BookType
{
Undefined,
Adventure,
Biography,
Dystopia,
Fantastic,
Horror,
Science,
ScienceFiction,
Poetry
}
3.2、在 Acme.BookStore.Domain 层下创建Book实体
public class Book : AuditedAggregateRoot<Guid>
{
public string Name { get; set; }
public BookType Type { get; set; }
public DateTime PublishDate { get; set; }
public float Price { get; set; }
}
3.3、在 Acme.BookStore.EntityFrameworkCore 层下的 BookStoreDbContext 类中将 Book 实体加入
[ConnectionStringName("Default")]
public class BookStoreDbContext : AbpDbContext<BookStoreDbContext>
{
public DbSet<AppUser> Users { get; set; }
public DbSet<Book> Books { get; set; }
}
3.4、将 Book 实体映射到数据库表中
在 Acme.BookStore.EntityFrameworkCore 层下的 BookStoreDbContextModelCreatingExtensions 类中的 ConfigureBookStore 方法中添加 Book 实体的映射文件
public static class BookStoreDbContextModelCreatingExtensions
{
public static void ConfigureBookStore(this ModelBuilder builder)
{
Check.NotNull(builder, nameof(builder));
builder.Entity<Book>(b =>
{
b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
});
}
}
3.5、数据迁移
- 打开 程序包管理器控制台(PMC)
- 选择 Acme.BookStore.EntityFrameworkCore.DbMigrations 作为默认项目并使用 Add-Migraction 命令迁移项目 成功后会创建一个迁移类
3.6、添加种子数据(可选)
在 Acme.BookStore.Domain 层下创建 BookStoreDataSeederContributor 类
public class BookStoreDataSeederContributor : IDataSeedContributor, ITransientDependency
{
private readonly IRepository<Book, Guid> _bookRepository;
public BookStoreDataSeederContributor(IRepository<Book, Guid> bookRepository)
{
_bookRepository = bookRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (await _bookRepository.GetCountAsync() <= 0)
{
await _bookRepository.InsertAsync(new Book
{
Name = "1984",
Type = BookType.Dystopia,
PublishDate = new DateTime(1949, 6, 8),
Price = 19.84f
},
autoSave: true);
await _bookRepository.InsertAsync(
new Book
{
Name = "The Hitchhiker's Guide to the Galaxy",
Type = BookType.ScienceFiction,
PublishDate = new DateTime(1995, 9, 27),
Price = 42.0f
},
autoSave: true
);
}
}
}
3.7、更新数据库
将 Acme.BookStore.DbMigrator 设为启动项目,并更改它下面的 appsettings.json 文件
更改 appsettings.json 文件中的数据库连接字符串(这里我使用VS自带的SqlServer数据库)。
3.7.1、视图 —> SQL Server对象资源管理器
3.7.2、创建数据库 BootStore
3.7.3、获取连接字符串
3.7.4、更改 appsettings.json ,将上一步复制的数据库连接字符串替换到 ConnectionString->Default 的 值中
3.7.5、F5运行项目
3.8、在 Acme.BookStore.Application.Contracts 层下创建 BookDto 类及CreateUpdateBookDto类型,并使用 AutoMapper 将 Book 实体转成 BookDto 对象,将CreateUpdateBookDto对象转成Book实体的映射
public class BookDto : AuditedEntityDto<Guid>
{
public string Name { get; set; }
public BookType Type { get; set; }
public DateTime PublishDate { get; set; }
public float Price { get; set; }
}
public class CreateUpdateBookDto
{
[Required]
[StringLength(128)]
public string Name { get; set; }
[Required]
public BookType Type { get; set; } = BookType.Undefined;
[Required]
[DataType(DataType.Date)]
public DateTime PublishDate { get; set; } = DateTime.Now;
[Required]
public float Price { get; set; }
}
在 Acme.BookStore.Application 层下的 BookStoreApplicationAutoMapperProfile 类中将 Book 实体转成 BookDto 对象
namespace Acme.BookStore
{
public class BookStoreApplicationAutoMapperProfile : Profile
{
public BookStoreApplicationAutoMapperProfile()
{
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<Book, BookDto>();
CreateMap<CreateUpdateBookDto, Book>();
}
}
}
3.9、创建 IBookAppService 接口 及它的实现类 BookAppService
在 Acme.BookStore.Application.Contracts 项目下 添加 IBookAppService 接口
namespace Acme.BookStore
{
public interface IBookAppService :
ICrudAppService<//定义CRUD方法
BookDto,//用来展示
Guid,//主键类型
PagedAndSortedResultRequestDto,//用于分页和排序
CreateUpdateBookDto,//用于创建
CreateUpdateBookDto//用于更新
>
{
}
}
在 Acme.BookStore.Application 项目下添加 BookAppService 类
namespace Acme.BookStore
{
public class BookAppService :
CrudAppService<
Book,
BookDto,
Guid,
PagedAndSortedResultRequestDto,
CreateUpdateBookDto,
CreateUpdateBookDto>, IBookAppService
{
public BookAppService(IRepository<Book, Guid> repository)
: base(repository)
{
}
}
}
3.10、设置 Acme.BookStore.HttpApi.Host 为启动项目,并修改它的 appsettings.json 文件并运行
3.10.1、设置 appsettings.json 设置方式同 3.7.4
3.10.2 运行项目
是不是非常奇怪,通常我们需要创建Controller以将应用程序服务公开为HTTP API端点。而ABP可以自动按照约定(惯例)将应用程序服务配置为MVC API控制器并使用 Swagger 来管理API文档。是不是很酷,我们没有编写任何代码来创建API控制器,但是现在我们有了一个可以正常使用的REST API!
四、ABP分层
4.1、Domain
Domain(领域) 划分为两个项目,Domain.Share 和 Domain
Domain.Share :包含常量,枚举和其他类型, 它不能包含实体,存储库,域服务或任何其他业务对象. 可以安全地与模块中的所有层使用. 此包也可以与第三方客户端使用.
Domain: 包含实体, 仓储接口,领域服务接口及其实现和其他领域对象. Domain 包依赖于 Domain.Shared 包.
4.2、Application
Application(应用服务) 划分为两个项目 Application.Contracts 和 Application
Application.Contracts:包含应用服务接口和相关的数据传输对象(DTO). Application contract 包依赖于 Domain.Shared 包
Application:包含应用服务实现. Application 包依赖于 Domain 包和 Application.Contracts 包
4.3、Infrastructure
Infrastructure(基础设施) 为每个orm/数据库集成创建一个独立的集成包, 比如Entity Framework Core 和 MongoDB.
4.4、HTTP
- 为模块开发REST风格的HTTP API,
- 为每个应用服务创建一个Controller (通常通过实现其接口). 这些控制器使用应用服务接口来委托操作. 它根据需要配置路由, HTTP方法和其他与Web相关的东西.
- HTTP API 包只依赖于 Application.Contracts 包. 不要依赖 Application 包,
- 创建一个为HTTP API包提供客户端服务的HTTP API Client包,这些客户端服务将应用服务接口实现远程端点的客户端.HTTP API Client 包仅依赖于 Application.Contracts 包 使用ABP框架提供的动态代理HTTP C#客户端的功能.
4.5、Web
包含页面,视图,脚本,样式,图像和其他UI组件,Web 包仅依赖于 HttpApi 包
ABP框架遵循DDD原则和模式去实现分层应用程序模型,该模型由四个基本层组成:
- 表示层: 为用户提供接口. 使用应用层实现与用户交互.
- 应用层: 表示层与领域层的中介,编排业务对象执行特定的应用程序任务. 使用应用程序逻辑实现用例.
- 领域层: 包含业务对象以及业务规则. 是应用程序的核心.
- 基础设施层: 提供通用的技术功能,支持更高的层,主要使用第三方类库.
bp VNext 入门——让ABP跑起来的更多相关文章
- 实现 Abp Vnext Pro
Abp Vnext Pro 的 Vue 实现版本 开箱即用的中后台前端/设计解决方案 知识点 .Net Core5.0 Abp Vnext 4.x , Ant Design, Vue2.x Mysql ...
- Abp Vnext源码解析系列文章01---EventBus
一.简介 BP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅.第二种则是分布式事件总线,ABP vNext 自己封装了一个 ...
- ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程
基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...
- ABP入门教程
ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- [Abp vNext微服务实践] - 服务通讯
简介 服务通讯是微服务架构中必不可少的功能,服务通讯的效率决定了微服务架构的优略.常用的微服务通讯策略有两种,分别是rpc.http,其中rpc以gRpc框架为代表使用者最多.abp vNext微服务 ...
- 我和ABP vNext 的故事
Abp VNext是Abp的.NET Core 版本,但它不仅仅只是代码重写了.Abp团队在过去多年社区和商业版本的反馈上做了很多的改进.包括性能.底层的框架设计,它融合了更多优雅的设计实践.不管你是 ...
- 初识ABP vNext(1):开篇计划&基础知识
目录 前言 开始 审计(Audit) 本地化(Localization) 事件总线(Event Bus) 多租户(multi-tenancy technology) DDD分层 实体(Entity) ...
- [Abp vNext 源码分析] - 20. 电子邮件与短信支持
一.简介 ABP vNext 使用 Volo.Abp.Sms 包和 Volo.Abp.Emailing 包将短信和电子邮件作为基础设施进行了抽象,开发人员仅需要在使用的时候注入 ISmsSender ...
随机推荐
- Mac垃圾忘记清理?开启自动清理提醒帮助你!
Mac系统被广泛应用于各种职场生活和学习生活上,平时由于工作和学习忙碌,用户难免会忽略了对Mac的照料,Mac在日复一日地使用中,必定会逐渐变得"臃肿",系统中存在着各种文件缓存垃 ...
- 在线思维导图Ayoa共享功能使用教程
Ayoa是一个制作思维导图的软件,除了导图制作,小编在使用过程中还发现了一些令人惊喜的功能,这些功能使得Ayoa有了更大的亮点以吸引用户. 下面就为大家简单介绍几个小编认为Ayoa中较为实用的共享功能 ...
- Vegas教程分享,制作古装墨迹笔刷开场效果
许多酷炫的古装大片,片头曲介绍人物的时候,都有一种墨迹笔刷的开场效果,那么这个特效如何利用Vegas去做呢? 1.导入素材文件 首先呢,导入相关文件素材到视频制作软件Vegas中,点击页面上方如图1箭 ...
- css3系列之text的常用属性 和 Multi-column(多列)
text(文本) white-space: word-break word-wrap/overflow-wrap text-align: word-spacing letter-spacing tex ...
- 网络系列之 cookie增删改查(封装)
什么是cookie 呢?简单来说,这个小东西,会记录你的 浏览器 浏览习惯,或 账号密码等, 以便于提高用户的体验感. 举个例子: 你们有没有发现,去淘宝一些购物网站, 你搜索了 椅子, 挑选了一会椅 ...
- 【模版】【P3806】点分治
(7.17)早就想学点分治了--今天状态不太在线,眯一会写篇笔记来理理思路. ------------------------------------------------------------- ...
- Java蓝桥杯——贪心算法
贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...
- 利用python库stats进行t检验
t检验通常分为三种,分别是单样本t检验.双样本t检验和配对样本t检验.本文基于python的scipy.stats函数对每种t检验进行了介绍和实验. 一.t检验介绍 无论哪种t检验,都有以下的基本 ...
- [题解] [USACO05JAN]Muddy Fields G
题目TP门 题目大意 在一个 \(R×C\) 的矩阵中,每个点有两个状态:草地和泥地.你需要在泥地里铺 \(1×k\) 木块, \(k\) 为任意整数,求最少要多少木块. 思路 两个横向木块不会互相干 ...
- 3D网页小实验——将txt配置文本转化为3D陈列室
设计目标:借鉴前辈编程者的经验将简单的配置文本转化为3D场景,并根据配置文件在场景中加入图片和可播放的视频,最终形成可浏览的3D陈列室. 一.使用效果 1.txt配置文件: (博客园的富文本编辑器会改 ...