本文示例源代码地址https://github.com/lcyhjx/abp-traininggit
上一篇咱们已经对ABP是什么,能作什么、有了一个印象。那么接下来咱们将动手使用ABP框架快速开发一个API,你将会发现使用ABP框架有多么便利,会实实在在感觉到它的魅力。github
咱们使用ABP模板来建立应用程序,访问http://www.aspnetboilerplate.com/Templates,你将会看到以下页面
数据库
点击“建立项目”, 接着咱们就会从ABP模板网站上得到一个项目源码的压缩包AbpTraining.zip. 解压缩AbpTraining.zip就会得到初始项目的源代码。编程
"ConnectionStrings": { "Default": "Server=localhost; Database=AbpTrainingDb; Trusted_Connection=True;" }
功能: 根据商品名查询商品信息json
AbpTraining.Core\Products\Product.csc#
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; } } }
AbpTraining.Core\Products\ProductDomainService.csapi
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; } } }
AbpTraining.Application\Products\Dto\ProductDtoapp
using Abp.AutoMapper; namespace AbpTraining.Products.Dto { [AutoMapFrom(typeof(Product))] public class ProductDto { public string Name { get; set; } public decimal Price { get; set; } } }
AbpTraining.Application\Products\Dto\GetProductByNameInput框架
using System.ComponentModel.DataAnnotations; namespace AbpTraining.Products.Dto { public class GetProductByNameInput { [Required] public string Name { get; set; } } }
Mysoft.RDC.Application\Products\Dto\GetProductByNameOutputdom
namespace AbpTraining.Products.Dto { public class GetProductByNameOutput : ProductDto { } }
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); } }
AbpTraining.Application\Products\ProductAppService.cs
using System.Threading.Tasks; namespace AbpTraining.Products.Dto { public class ProductAppService : AbpTrainingAppServiceBase, IProductAppService { private readonly ProductDomainService _productDomainService; public ProductAppService(ProductDomainService productDomainService) { _productDomainService = productDomainService; } public async Task<GetProductByNameOutput> GetProductByName(GetProductByNameInput input) { //1.将input dto转换为domain obj //2.调用doamin service var item = await _productDomainService.GetProductByName(input.Name); //call other doamin serivce //3.将domain obj转换为output dto var output = ObjectMapper.Map<GetProductByNameOutput>(item); return output; } } }
在AbpTraining.EntityFrameworkCore\EntityFrameworkCore\AbpTrainingDbContext.cs 中添加以下代码片断
public DbSet<Product> Products { get; set; }
在包管理器控制台中,执行以下命令,生成迁移脚本文件
Add-Migration AddProduct -Verbos
在包管理器控制台中,执行以下命令,将新的实体同步数据库
Update-Database -Verbos
设置AbpTraining.Web.Host为启动项目,直接在Visual Studio中运行, 在Swagger的API列表中找到/api/services/app/Product/GetProductByName 便可以开始测试。
到此,咱们的第一个API就成功的完成了.