本文示例源代码地址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的更多相关文章

  1. 搭建一个Web API项目(DDD)

    传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...

  2. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  3. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  4. ASP.NET MVC Web API 学习笔记---第一个Web API程序【转】

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API. ...

  5. ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  6. 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 创 ...

  7. 【翻译】在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 ...

  8. [转]【翻译】在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 ...

  9. 使用模板创建第一个Web API项目

    软件环境 vs 2015 update3 本节将通过例子讲述创建Web API 项目的方法 第一步,打开vs ,依次通过[文件]菜单,[新建][项目]命令,大致步骤如下图 :   第2步,在弹出对话框 ...

随机推荐

  1. MIP (百度移动网页加速器)

    前言:第一次用移动网页加速器,感觉好心情都被弄坏了.确实性能提高了不少,但是限制js,对于一些交互实现都成问题.MIP是Mobile Instant Pages的缩写,指百度移动网页加速器, 是一套应 ...

  2. 优化的四个方面,缓存,表结构,索引,SQL语句

    一,缓存 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所 ...

  3. Redis——常见面试题

    一.memcached与redis的区别? 1.存储方式不同.memcached把数据全部存在内存之中,断电之后会挂掉,而redis虽然也用到了内存,但是会有部分数据存在硬盘中,保证数据持久性. 2. ...

  4. beta冲刺2

    q前言:今天晚上大概把github的的相关东西弄上了.然后把之前做的一些修改什么的也上传上去了.目测之后的话就是在自己这边改完然后直接上github那边去复制粘贴替换掉了. 昨天的问题:github这 ...

  5. 在Windows上安装「算法 第四版」组件

    这篇文档将向你介绍如何在Windows系统上安装本书将用到的Java开发环境,同时我们也提供了一个手把手的.使用我们提供的DrJava工具或者用命令行来创建.编译和运行你的第一个Java程序的手册,这 ...

  6. Flask 扩展 缓存

    如果同一个请求会被多次调用,每次调用都会消耗很多资源,并且每次返回的内容都相同,就该使用缓存了 自定义缓存装饰器 在使用Flask-Cache扩展实现缓存功能之前,我们先来自己写个视图缓存装饰器,方便 ...

  7. Struts2之配置文件中Action的详细配置(续)

    承接上一篇 4.处理结果的配置 Action类的实例对象调用某个方法,处理完用户请求之后,将返回一个逻辑视图名的字符串.核心Filter收到返回的逻辑视图名字符串,根据struts.xml中的逻辑视图 ...

  8. Fluent Interface(流式接口)

    我最初接触这个概念是读自<<模式-工程化实现及扩展>>,另外有Martin fowler大师 所写http://martinfowler.com/bliki/FluentInt ...

  9. bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...

  10. raid5 / raid5e / raid5ee的性能对比及其数据恢复原理

    RAID 5 是一种存储性能.数据安全和存储成本兼顾的存储解决方案. RAID 5可以理解为是RAID 0和RAID 1的折中方案.RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低 ...