long productRepository){_productRepository = productReposit

时间:2022-01-24 02:52:54

上一篇我们已经对ABP是什么,能做什么、有了一个印象。那么接下来我们将动手使用ABP框架快速开发一个API,你将会发明使用ABP框架有何等便当,会实实在在感应熏染到它的魅力。

环境要求

Visual Studio 2017

SQL Server

.Net Core SDK

创建应用措施

我们使用ABP模板来创建应用措施,访谒,你将会看到如下页面

long productRepository){_productRepository = productReposit

参照上图所示的选项选择

输入项目名称,我这里是"AbpTraining"

输入验证码

点击“创建项目”, 接着我们就会从ABP模板网站上获得一个项目源码的压缩包AbpTraining.zip. 解压缩AbpTraining.zip就会获得初始项目的源代码。

运行应用措施

进入解压目录,点击aspnet-core/AbpTraining.sln,打开解决方案

在本地Sql Server数据库实例中创建数据库AbpTrainingDb

找到AbpTraining.Web.Host/appsettings.json, 按照本身本地环境改削数据库连接(ConnectionStrings)

"ConnectionStrings": { "Default": "Server=localhost; Database=AbpTrainingDb; Trusted_Connection=True;" }

使用数据库迁移脚本创建初始数据库

在Visual Studio中选择工具-> Nuget承打点器-> 承打点器控制台

设置AbpTraining.Web.Host为启动项目

在承打点器控制台中设置AbpTraining.EntityFrameworkCore为默认项目

承打点器控制台中执行命令 update-database -verbos, 期待命令告成执行完成,就完成了数据库的同步

运行AbpTraining.Web.Host, 将会呈现swagger的api页面,措施运行告成

long productRepository){_productRepository = productReposit

我的第一个API 1. API成果

成果: 按照商品名盘问商品信息

2. 创建商品实体

AbpTraining.Core\Products\Product.cs

using Abp.Domain.Entities.Auditing; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace AbpTraining.Products { //可以显示的指定表名,不指定默认是实体名+s [Table("Product")] public class Product : FullAuditedEntity<long> { [Required] [StringLength(128)] public string Name { get; set; } public decimal Price { get; set; } } }

[Table("Product")] 显示指定实体对应的表名,如果不指定,默认用类名+s

FullAuditedEntity

[Required]指定字段是必填的, 不指定则字段可为空

[StringLength(128)]指定字段最大长度为128

3. 创建商品范围DomainService

AbpTraining.Core\Products\ProductDomainService.cs

using Abp.Domain.Repositories; using Abp.Domain.Services; using System.Threading.Tasks; using System.Linq; using Abp.UI; using Microsoft.EntityFrameworkCore; namespace AbpTraining.Products { public class ProductDomainService : DomainService { private readonly IRepository<Product, long> _productRepository; public ProductDomainService(IRepository<Product, long> productRepository) { _productRepository = productRepository; } public async Task<Product> GetProductByName(string name) { var query = from p in _productRepository.GetAll() where p.Name == name select p; var product = await query.FirstOrDefaultAsync(); if (product == null) { throw new UserFriendlyException($"商品({name})不存在"); } if (product.Price < 0) { throw new UserFriendlyException($"商品({name})的价格小于0,请查抄"); } return product; } } }

范围处事要担任DomainService

_productRepository数据仓储直接依赖注入

使用async await一异步编程模型

使用Linq To Sql盘问数据

如果要返回业务错误动静给客户端,要使用UserFriendlyException

4. 创建商品ApplicationService 4.1 界说Dto

AbpTraining.Application\Products\Dto\ProductDto

using Abp.AutoMapper; namespace AbpTraining.Products.Dto { [AutoMapFrom(typeof(Product))] public class ProductDto { public string Name { get; set; } public decimal Price { get; set; } } }

AutoMapFrom特性指明从哪一个类可以自动映射到当前类,这样就不用手动的去做实体时间的转换

AbpTraining.Application\Products\Dto\GetProductByNameInput

using System.ComponentModel.DataAnnotations; namespace AbpTraining.Products.Dto { public class GetProductByNameInput { [Required] public string Name { get; set; } } }

[Required] - input东西中有此特性,ABP会自动对request的这个字段做必填验证

Mysoft.RDC.Application\Products\Dto\GetProductByNameOutput

namespace AbpTraining.Products.Dto { public class GetProductByNameOutput : ProductDto { } } 4.2 界说ApplicationService接口

AbpTraining.Application\Products\IProductAppService.cs

using Abp.Application.Services; using AbpTraining.Products.Dto; using System.Threading.Tasks; namespace AbpTraining.Products { public interface IProductAppService : IApplicationService { Task<GetProductByNameOutput> GetProductByName(GetProductByNameInput input); } }

应用处事接口要担任IApplicationService

4.3 商品ApplicationService实现