本文示例源代码地址https://github.com/lcyhjx/abp-training
上一篇我们已经对ABP是什么,能做什么、有了一个印象。那么接下来我们将动手使用ABP框架快速开发一个API,你将会发现使用ABP框架有多么便利,会实实在在感受到它的魅力。
我们使用ABP模板来创建应用程序,访问http://www.aspnetboilerplate.com/Templates,你将会看到如下页面
点击“创建项目”, 接着我们就会从ABP模板网站上获得一个项目源码的压缩包AbpTraining.zip. 解压缩AbpTraining.zip就会获得初始项目的源代码。
功能: 根据商品名查询商品信息
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; }
}
}
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;
}
}
}
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; }
}
}
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\GetProductByNameOutput
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就成功的完成了.