上一篇我们已经对ABP是什么,能做什么、有了一个印象。那么接下来我们将动手使用ABP框架快速开发一个API,你将会发明使用ABP框架有何等便当,会实实在在感应熏染到它的魅力。
环境要求Visual Studio 2017
SQL Server
.Net Core SDK
创建应用措施我们使用ABP模板来创建应用措施,访谒,你将会看到如下页面
参照上图所示的选项选择
输入项目名称,我这里是"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页面,措施运行告成
成果: 按照商品名盘问商品信息
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. 创建商品范围DomainServiceAbpTraining.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 界说DtoAbpTraining.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实现