ABP框架 - 我的第一个Web API
本文示例源代码地址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
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 为实体添加审计字段CreattonTime、CreatorUserId、DeleterUserId、DeletionTime、LastModificationTime、LastModifierUserId, 类型指定主键的类型
- [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实现
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;
}
}
}
- 应用服务实现要继承AbpTrainingAppServiceBase
5. 数据库
5.1 数据库实体映射
在AbpTraining.EntityFrameworkCore\EntityFrameworkCore\AbpTrainingDbContext.cs 中添加如下代码片段
public DbSet<Product> Products { get; set; }
5.2 生成migration文件
在包管理器控制台中,执行如下命令,生成迁移脚本文件
Add-Migration AddProduct -Verbos
- 执行完成后,会在在AbpTraining.EntityFrameworkCore\Migrations下看到新生成的脚本文件,我这次生成的文件名是20180405043514_AddProduct.cs (会有一个时间戳前缀,每次会不一样)
5.3 更新数据库
在包管理器控制台中,执行如下命令,将新的实体同步数据库
Update-Database -Verbos
- 执行完成后,你会在数据库看到一个新表Product
6. 运行服务、测试
设置AbpTraining.Web.Host为启动项目,直接在Visual Studio中运行, 在Swagger的API列表中找到/api/services/app/Product/GetProductByName 即可以开始测试。
到此,我们的第一个API就成功的完成了.
ABP框架 - 我的第一个Web API的更多相关文章
- 搭建一个Web API项目(DDD)
传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...
- 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序【转】
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API. ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...
- 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】
Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...
- 【翻译】在Visual Studio中使用Asp.Net Core MVC创建你的第一个Web API应用(一)
HTTP is not just for serving up web pages. It's also a powerful platform for building APIs that expo ...
- [转]【翻译】在Visual Studio中使用Asp.Net Core MVC创建你的第一个Web API应用(一)
本文转自:https://www.cnblogs.com/inday/p/6288707.html HTTP is not just for serving up web pages. It’s al ...
- 使用模板创建第一个Web API项目
软件环境 vs 2015 update3 本节将通过例子讲述创建Web API 项目的方法 第一步,打开vs ,依次通过[文件]菜单,[新建][项目]命令,大致步骤如下图 : 第2步,在弹出对话框 ...
随机推荐
- ELK学习笔记(一)安装Elasticsearch、Kibana、Logstash和X-Pack
最近在学习ELK的时候踩了不少的坑,特此写个笔记记录下学习过程. 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因 ...
- linux系统磁盘空间满了怎么办看完这篇文章之后就知道怎么解决了
废话不多说直接上图 可以看得到 / 下面已使用100%,已经没有剩余空间可以使用了,上面跑的服务已经访问不了了. 接下来我就看看有没有垃圾文件可以清理的 du -sh * 由于这个机器比较特殊,上面有 ...
- 网络通信 --> epoll用法
epoll用法 在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll. epoll函数 1. 创建epoll的句柄 siz ...
- vue/axios请求拦截
import axios from 'axios';import { Message } from 'element-ui';import Cookies from 'js-cookie';impor ...
- JavaScript(第十五天)【匿名函数和闭包】
学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...
- python pip包管理
pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品.本文将详细说明 安装 pip 的方法和 使用 pip 的一些基本操作如安装.更新和卸载 python ...
- 201421123042 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承中的关键词:Soper,object,override,project, 1.2 尝试使用思维导图将这些关键词组织起来.注: ...
- V7000数据恢复(存储文件系统损坏)案例_北亚数据恢复
我们今天介绍的数据恢复案例是一起 v7000存储文件系统损坏导致的数据丢失,首先简单介绍一下设备基本情况:发生文件系统损坏的是一台挂载在Windows2003服务器上的v7000存储,划分了一个容量为 ...
- nyoj 公约数和公倍数
公约数和公倍数 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 小明被一个问题给难住了,现在需要你帮帮忙.问题是:给出两个正整数,求出它们的最大公约数和最小公倍数. ...
- redux的知识点
Redux: Redux 是针对 JavaScript应用的可预测状态容器 就是用来管理数据的.stroe 保存数据action领导 下达命令reducer员工 执行命令 下载命令: npm ins ...