前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABP框架 - 我的第一个Web API

ABP框架 - 我的第一个Web API

作者头像
我思故我在
发布2018-05-11 11:56:43
1.7K0
发布2018-05-11 11:56:43
举报
文章被收录于专栏:我思故我在

本文示例源代码地址https://github.com/lcyhjx/abp-training

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

环境要求

  • Visual Studio 2017
  • SQL Server
  • .Net Core SDK

创建应用程序

我们使用ABP模板来创建应用程序,访问http://www.aspnetboilerplate.com/Templates,你将会看到如下页面

  • 参照上图所示的选项选择
  • 输入项目名称,我这里是"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页面,程序运行成功

我的第一个API

1. API功能

功能: 根据商品名查询商品信息

2. 创建商品实体

AbpTraining.Core\Products\Product.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
namespace AbpTraining.Products.Dto
{
    public  class GetProductByNameOutput : ProductDto
    {
    }
}
4.2 定义ApplicationService接口

AbpTraining.Application\Products\IProductAppService.cs

代码语言:javascript
复制
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实现

AbpTraining.Application\Products\ProductAppService.cs

代码语言:javascript
复制
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;
        }
    }
}
  • 应用服务实现要继承AbpTrainingAppServiceBase
5. 数据库
5.1 数据库实体映射

在AbpTraining.EntityFrameworkCore\EntityFrameworkCore\AbpTrainingDbContext.cs 中添加如下代码片段

代码语言:javascript
复制
public DbSet<Product> Products { get; set; }
5.2 生成migration文件

在包管理器控制台中,执行如下命令,生成迁移脚本文件

代码语言:javascript
复制
Add-Migration AddProduct -Verbos
  • 执行完成后,会在在AbpTraining.EntityFrameworkCore\Migrations下看到新生成的脚本文件,我这次生成的文件名是20180405043514_AddProduct.cs (会有一个时间戳前缀,每次会不一样)
5.3 更新数据库

在包管理器控制台中,执行如下命令,将新的实体同步数据库

代码语言:javascript
复制
Update-Database -Verbos
  • 执行完成后,你会在数据库看到一个新表Product
6. 运行服务、测试

设置AbpTraining.Web.Host为启动项目,直接在Visual Studio中运行, 在Swagger的API列表中找到/api/services/app/Product/GetProductByName 即可以开始测试。

到此,我们的第一个API就成功的完成了.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境要求
  • 创建应用程序
  • 运行应用程序
  • 我的第一个API
    • 1. API功能
      • 2. 创建商品实体
        • 3. 创建商品领域DomainService
          • 4. 创建商品ApplicationService
            • 4.1 定义Dto
            • 4.2 定义ApplicationService接口
            • 4.3 商品ApplicationService实现
          • 5. 数据库
            • 5.1 数据库实体映射
            • 5.2 生成migration文件
            • 5.3 更新数据库
          • 6. 运行服务、测试
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档