C# Abp框架入门系列文章(一)(上)

简介: C# Abp框架入门系列文章(一)

随着技术的进步,各式各样的框架层出不穷,轮子越来越多,那么有没有哪些优秀的开发框架供我们使用呢?如果我们能够将各方面优秀的框架集合起来,应用到项目开发中,我们的工作是不是能事半功倍呢?而且各个框架的使用方向不同,很多配置也不同,如果能够将繁杂的基础工作集成起来,由统一的框架来完成,那么我们就可以专注于业务逻辑,提高工作效率。现在Abp就是这么一个框架,使用流行技术开发现代web应用程序的最佳实践。本文作为Abp框架的入门文章,仅供学习分享使用,如有不足之处,还请指正。

什么是Abp?

ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。

ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。ABP是基于最新的ASP.NET CORE,ASP.NET MVC和Web API技术的应用程序框架。并使用流行的框架和库,它提供了便于使用的授权,依赖注入,验证,异常处理,本地化,日志记录,缓存等常用功能。

Abp架构

ABP实现了多层架构(领域层,应用层,基础设施层和表示层),以及领域驱动设计(实体,存储库,领域服务,应用程序服务,DTO等)。还实现和提供了良好的基础设施来实现最佳实践,如依赖注入。

了解了Abp框架的基础知识之后,让我们一步一步的搭建Abp框架,并实现一个简单的小例子。

安装CLI

输入cmd打开命令行窗口,然后输入以下命令,安装Abp.Cli,如下所示:

dotnet tool install -g Volo.Abp.Cli

安装过程,如下图所示:

创建第一个Abp项目

在命令行,切换到程序所在目录【最好是空目录】,然后通过命令进行创建,如下所示:

abp new Acme.BookStore

安装过程,如下图所示:

关于Abp的Cli相关命令,可参考官方文档

项目创建成功后,如下所示:

通过Visual Studio打开解决方案,如下所示:

还原数据库

在Abp解决方案中,通过运行【Acme.BookStore.DbMigrator】进行初始化数据库。该项目是控制台程序,采用Entity Framework的Code First方式迁移数据库。

打开项目【Acme.BookStore.DbMigrator】中 appsettings.json文件,修改数据库连接字符串,为本机连接字符串,如下所示:

将项目设置为启动项目,然后F5(或Ctrl + F5)运行即可。当出现以下页面时,表示数据库迁移成功。如下所示:

数据库还原成功后,打开SQL Server数据库,会多出一个数据库【BookStore】,如下所示:

注意:最新版本的Abp版本为5.0.0,支持的Entity Framework Core版本为6.0,目前已不再支持SQL Server 2008 R2。所以需要升级数据库版本到2012。

运行Abp程序

打开项目【Acme.BookStore.Web】中的appsettings.json文件,修改数据库连接字符串,如下所示:

将项目【Acme.BookStore.Web】设置为启动项目,然后按F5(或Ctrl+F5)运行项目。Visual Studio会自动打开首页【https://localhost:44327/】,如下所示:

在首页上,点击登录【默认用户名 admin,密码 1q2w3E* 】,如下所示:

登录成功后,如下所示:

以上就是Abp最新默认框架示例。接下来让我们一起开发一个图书管理的小功能。

Abp入门示例

1. 创建Book实体类

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

  • Acme.BookStore.Domain包含你的实体, 领域服务和其他核心域对象.
  • Acme.BookStore.Domain.Shared包含可与客户共享的常量,枚举或其他域相关对象.

在解决方案的领域层(Acme.BookStore.Domain项目)中定义实体,如下所示:

在Acme.BookStore.Domain项目中,右键创建文件夹Books,然后新增Book类,如下所示:

namespace Acme.BookStore.Books
{
    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; }
    }
}

其中Book继承自AuditedAggregateRoot<Guid>。在Abp中,默认提供了两个实体基类AggregateRootEntity,而AuditedAggregateRoot<Guid>是AggregateRoot的派生类。其中Guid是主键类型。

上述类中用到的BookType为创建的 枚举类型,在Acme.BookStore.Domain.Shared项目中,如下所示:

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

Book和BookType,如下所示:

2. 将Book实体添加到DbContext中

EF Core需要你将实体和 DbContext 建立关联.最简单的做法是在Acme.BookStore.EntityFrameworkCore项目的BookStoreDbContext类中添加DbSet属性.如下所示:

namespace Acme.BookStore.EntityFrameworkCore
{
    [ReplaceDbContext(typeof(IIdentityDbContext))]
    [ReplaceDbContext(typeof(ITenantManagementDbContext))]
    [ConnectionStringName("Default")]
    public class BookStoreDbContext :
        AbpDbContext<BookStoreDbContext>,
        IIdentityDbContext,
        ITenantManagementDbContext
    {
        /* Add DbSet properties for your Aggregate Roots / Entities here. */
        #region Entities from the modules
        //其他自带的已略去
        /// <summary>
        /// Book示例数据库操作
        /// </summary>
        public DbSet<Book> Books { get; set; }
        #endregion
    }
}

3. 将Book实体映射到数据库表

在本示例中采用Code First方式自动生成数据库,所以需要将实体和数据库表进行映射。在 Acme.BookStore.EntityFrameworkCore 项目中打开 BookStoreDbContextModelCreatingExtensions.cs 文件,添加 Book 实体的映射代码. 最终类应为:

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<Book>(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() 方法优雅的配置/映射继承的属性,应始终对你所有的实体使用它.

3. 添加数据迁移

启动模板使用EF Core Code First Migrations创建和维护数据库架构. 我们应该创建一个新的迁移并且应用到数据库.

Acme.BookStore.EntityFrameworkCore 目录打开命令行终端输入以下命令:

dotnet ef migrations add Created_Book_Entity

具体示例如下所示:

上述命令,会添加新的迁移类到项目中,如下所示:

4. 添加种子数据

如果不需要通过代码添加种子数据,可以跳过,建议遵循步骤操作,以熟悉Abp框架。在 Acme.BookStore.Domain 项目下创建派生 IDataSeedContributor 的类,并且拷贝以下代码:

namespace Acme.BookStore.Books
{
    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
                );
            }
        }
    }
}
  • 如果数据库中当前没有图书,则此代码使用 IRepository<Book, Guid>(默认为repository)将两本书插入数据库.
相关文章
|
1月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
54 7
|
1月前
|
C#
C#入门
C#入门
26 0
|
22天前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
132 64
|
4天前
|
开发框架 C# iOS开发
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
|
4天前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
4天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
4天前
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
|
1月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
59 8
|
1月前
|
开发框架 前端开发 API
C#/.NET/.NET Core优秀项目和框架2024年9月简报
C#/.NET/.NET Core优秀项目和框架2024年9月简报
|
2月前
|
编译器 C# Android开发
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
253 8