zoukankan      html  css  js  c++  java
  • .NET5 ABP框架(二)- WebApi

    1. API功能

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

    2. 创建商品实体

    AbpTraining.CoreProductsProduct.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.CoreProductsProductDomainService.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.ApplicationProductsDtoProductDto

    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.ApplicationProductsDtoGetProductByNameInput

    using System.ComponentModel.DataAnnotations;
    
    namespace AbpTraining.Products.Dto
    {
        public class GetProductByNameInput
        {
            [Required]
            public string Name { get; set; }
        }
    }
    
    • [Required] - input对象中有此特性,ABP会自动对request的这个字段做必填验证

    Mysoft.RDC.ApplicationProductsDtoGetProductByNameOutput

    namespace AbpTraining.Products.Dto
    {
        public  class GetProductByNameOutput : ProductDto
        {
        }
    }
    
    4.2 定义ApplicationService接口

    AbpTraining.ApplicationProductsIProductAppService.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.ApplicationProductsProductAppService.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.EntityFrameworkCoreEntityFrameworkCoreAbpTrainingDbContext.cs 中添加如下代码片段

    public DbSet<Product> Products { get; set; }
    
    5.2 生成migration文件

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

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

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

    Update-Database -Verbos
    
    • 执行完成后,你会在数据库看到一个新表Product

    6. 运行服务、测试

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

    ok,大功告成,亲测。

    转自:https://www.cnblogs.com/lcyhjx/p/8698507.html

  • 相关阅读:
    mysql日志
    验证栈序列
    限流方案分析
    集合
    数据结构-树
    链表的中间节点
    PHP实现链表
    php扩展安装方式
    2017 Multi-University Training Contest
    用LCT解一类动态图的问题
  • 原文地址:https://www.cnblogs.com/PrintY/p/15322915.html
Copyright © 2011-2022 走看看