因好多群友@我说,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跑起来的更多相关文章

  1. 实现 Abp Vnext Pro

    Abp Vnext Pro 的 Vue 实现版本 开箱即用的中后台前端/设计解决方案 知识点 .Net Core5.0 Abp Vnext 4.x , Ant Design, Vue2.x Mysql ...

  2. Abp Vnext源码解析系列文章01---EventBus

    一.简介 BP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅.第二种则是分布式事件总线,ABP vNext 自己封装了一个 ...

  3. ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  4. 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

    基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...

  5. ABP入门教程

    ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  6. [Abp vNext微服务实践] - 服务通讯

    简介 服务通讯是微服务架构中必不可少的功能,服务通讯的效率决定了微服务架构的优略.常用的微服务通讯策略有两种,分别是rpc.http,其中rpc以gRpc框架为代表使用者最多.abp vNext微服务 ...

  7. 我和ABP vNext 的故事

    Abp VNext是Abp的.NET Core 版本,但它不仅仅只是代码重写了.Abp团队在过去多年社区和商业版本的反馈上做了很多的改进.包括性能.底层的框架设计,它融合了更多优雅的设计实践.不管你是 ...

  8. 初识ABP vNext(1):开篇计划&基础知识

    目录 前言 开始 审计(Audit) 本地化(Localization) 事件总线(Event Bus) 多租户(multi-tenancy technology) DDD分层 实体(Entity) ...

  9. [Abp vNext 源码分析] - 20. 电子邮件与短信支持

    一.简介 ABP vNext 使用 Volo.Abp.Sms 包和 Volo.Abp.Emailing 包将短信和电子邮件作为基础设施进行了抽象,开发人员仅需要在使用的时候注入 ISmsSender ...

随机推荐

  1. 深入浅出!springboot从入门到精通,实战开发全套教程!

    前言 之前一直有粉丝想让我出一套springboot实战开发的教程,我这边总结了很久资料和经验,在最近总算把这套教程的大纲和内容初步总结完毕了,这份教程从springboot的入门到精通全部涵盖在内, ...

  2. 下载器Folx怎么安装使用

    应该使用哪个下载工具?这个如果是Windows上会有无数答案的问题,在Mac上却变得异常的纠结.比如Leech和Aria2,这两款软件,前者功能相对比较简单,后者的配置又稍微有点复杂,很难找到一款相对 ...

  3. MathType可以和哪些Microsoft Office版本一起使用?

    Office类软件可能是我们碰到电脑后,最先接触到的电脑软件了.尤记得,当初的微机课一开始就会讲word和excel的使用,一开始可能学不太明白,但后来越来越频繁的使用office软件,不说offic ...

  4. 一 HTML基础入门

    HTML概念 HTML是标记语言,由W3C组织提供的一套标记标签组成.其使用标记标签来描述网页,一个网页除了由大量的标签组成,还有后续要学习的css样式和JavaScript脚本组合而成. 网页与网站 ...

  5. 商业智能(BI)可视化大屏的设计及使用原则

    信息时代,数据是一种可贵的资源,我们可能经常听到的一句话就是:用数据说话.但是,在没有进行系统化整理之前,数据不过只是一串串冰冷的数字,我们很难从大量的数据中获取到有价值的信息.只有通过合适的可视化工 ...

  6. 对JVM的一个基础了解

    1.JVM范围 2.JVM和class文件 (1).JVM和Java语言无关,JVM是一种规范,任何语言只要能编译成class文件格式都能在JVM上运行 3.class文件格式 (1).class文件 ...

  7. 跟随杠精的视角一起来了解Redis的主从复制

    不想弹好吉他的撸铁狗,都不是好的程序猿 虽然说单机的Redis性能很好,也有完备的持久化机制,那如果你的业务体量真的很大,超过了单机能够承载的上限了怎么办?不做任何处理的话Redis挂了怎么办?带着这 ...

  8. C和指针---结构和联合

    一.结构 1.C提供了两种类型的聚合数据类型---数组.结构.数组是相同类型的元素集合,它的每个元素长度相同,故可以通过下标引用或指针间接访问来选择的;而结构可以把不同类型的值存储在一起,由于结构的成 ...

  9. Alpha冲刺-第七次冲刺笔记

    Alpha冲刺-冲刺笔记 这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 这个作业要求在哪里 https://edu.cnblogs. ...

  10. Nginx配置Https(详细、完整)

    Nginx配置Https(详细.完整) 原文链接:请支持原创 前置条件: 在配置https之前请确保下面的步骤已经完成 服务器已经安装nginx并且通过http可以正常访问 不会安装nginx的可以参 ...