您当前的位置: 首页 >  服务器

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Abp vnext Web应用程序开发教程 1 —— 创建服务器端

寒冰屋 发布时间:2020-09-26 20:24:21 ,浏览量:0

文章目录
  • 关于本教程
    • 下载源代码
  • 创建解决方案
  • 创建书籍实体
    • BookType枚举
    • 将图书实体添加到DbContext
    • 将图书实体映射到数据库表
    • 添加数据库迁移
    • 添加样本种子数据
    • 更新数据库
  • 创建应用程序服务
    • BookDto
    • CreateUpdateBookDto
    • IBookAppService
    • BookAppService
  • 自动API控制器
    • Swagger UI
  • 下一部分

关于本教程

本教程基于版本3.1

在本教程系列中,您将构建一个名为Acme.BookStore的基于ABP的Web应用程序。该应用程序用于管理书籍及其作者的列表。它是使用以下技术开发的:

  • 实体框架核心作为ORM提供者。
  • MVC/Razor页面作为UI框架。

本教程分为以下部分:

第1部分:创建服务器端(此部分)

第2部分:图书列表页面

第3部分:创建、更新和删除书籍

第4部分:集成测试

第5部分:授权

第6部分:作者:领领域层

第7部分:作者:数据库集成

第8部分:作者:应用程序层

第9部分:作者:用户界面

第10部分:书与作者的关系

下载源代码

MVC (Razor Pages) UI with EF Core

创建解决方案

在开始开发之前,请按照入门教程来创建一个名为Acme.BookStore的新解决方案并运行它。

创建书籍实体

启动模板中的领域层分为两个项目:

  • Acme.BookStore.Domain包含您的实体,领域服务和其他核心域对象。
  • Acme.BookStore.Domain.Shared包含constantsenums或其他领域相关的那些能够与客户共享的对象。

因此,在解决方案的领域层(Acme.BookStore.Domain项目)中定义您的实体。

应用程序的主要实体是Book。在Acme.BookStore.Domain项目中创建一个Books文件夹(命名空间),并在其中添加一个Book类:

using System;
using Volo.Abp.Domain.Entities.Auditing;

namespace Acme.BookStore.Books
{
    public class Book : AuditedAggregateRoot
    {
        public string Name { get; set; }

        public BookType Type { get; set; }

        public DateTime PublishDate { get; set; }

        public float Price { get; set; }
    }
}
  • ABP框架为实体提供了两个基本基类:AggregateRootEntity。聚合根是域驱动设计概念,可以将其视为直接查询和使用的根实体(有关更多信息,请参见实体文档)。

  • Book从实体继承了AuditedAggregateRoot,其在AggregateRoot类的顶部添加了一些基本的审计属性(比如CreationTimeCreatorIdLastModificationTime…)。ABP会自动为您管理这些属性。

  • Guid是主键类型的Book实体。

为了简单起见,本教程将实体属性使用public get / set修饰。如果您了解有关DDD最佳做法的更多信息,请参见实体文档。

BookType枚举

Book实体使用BookType枚举。在Acme.BookStore.Domain.Shared项目中创建一个Books文件夹(命名空间)并在其中添加一个BookType内部文件:

namespace Acme.BookStore.Books
{
    public enum BookType
    {
        Undefined,
        Adventure,
        Biography,
        Dystopia,
        Fantastic,
        Horror,
        Science,
        ScienceFiction,
        Poetry
    }
}

最终的文件夹/文件结构应如下所示:

在这里插入图片描述

将图书实体添加到DbContext

EF Core要求将实体与您的DbContext关联。最简单的方法是在Acme.BookStore.EntityFrameworkCore项目的BookStoreDbContext类中添加一个DbSet属性,如下所示:

public class BookStoreDbContext : AbpDbContext
{
    public DbSet Books { get; set; }
    //...
}
将图书实体映射到数据库表

Acme.BookStore.EntityFrameworkCore项目中打开BookStoreDbContextModelCreatingExtensions.cs文件,然后添加Book实体的映射代码。最终类应为:

using Acme.BookStore.Books;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore.Modeling;

namespace Acme.BookStore.EntityFrameworkCore
{
    public static class BookStoreDbContextModelCreatingExtensions
    {
        public static void ConfigureBookStore(this ModelBuilder builder)
        {
            Check.NotNull(builder, nameof(builder));

            /* Configure your own tables/entities inside here */

            builder.Entity(b =>
            {
                b.ToTable(BookStoreConsts.DbTablePrefix + "Books",
                          BookStoreConsts.DbSchema);
                b.ConfigureByConvention(); //auto configure for the base class props
                b.Property(x => x.Name).IsRequired().HasMaxLength(128);
            });
        }
    }
}
  • BookStoreConsts含有用于表的架构和表前缀的常量值。您不必使用它,但是建议您在单点中控制表前缀。

  • ConfigureByConvention()方法优雅地配置/映射继承的属性。始终将其用于所有实体。

添加数据库迁移

启动模板使用EF Core Code First Migrations来创建和维护数据库架构。在菜单工具> NuGet软件包管理器下,打开软件包管理器控制台(PMC)。 在这里插入图片描述

选择Acme.BookStore.EntityFrameworkCore.DbMigrations作为默认项目并执行以下命令:

Add-Migration "Created_Book_Entity"

在这里插入图片描述

这将在Acme.BookStore.EntityFrameworkCore.DbMigrations项目的Migrations文件夹内创建一个新的迁移类。

在更新数据库之前,请阅读以下部分,以了解如何将一些初始数据插入到数据库中。

如果使用的不是Visual Studio,则可以使用此处文档中的dotnet-ef工具。

添加样本种子数据

在运行应用程序之前,最好在数据库中包含一些初始数据。本节介绍ABP框架的数据种子系统。如果您不想创建种子数据,则可以跳过本节,但是建议您遵循它来学习此有用的ABP Framework功能。

创建一个从*.Domain项目中的IDataSeedContributor派生的类,并复制以下代码:

using System;
using System.Threading.Tasks;
using Acme.BookStore.Books;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;

namespace Acme.BookStore
{
    public class BookStoreDataSeederContributor
        : IDataSeedContributor, ITransientDependency
    {
        private readonly IRepository _bookRepository;

        public BookStoreDataSeederContributor(IRepository bookRepository)
        {
            _bookRepository = bookRepository;
        }

        public async Task SeedAsync(DataSeedContext context)
        {
            if (await _bookRepository.GetCountAsync()             
关注
打赏
1665926880
查看更多评论
0.0474s