zoukankan      html  css  js  c++  java
  • 使用ASP.NET Core 3.x 构建 RESTful API P13 P14 获取父子关系的资源

    使用ASP.NET Core 3.x 构建 RESTful API P13 P14 获取父子关系的资源


    博客园文章id:12674187


    父子关系的数据在API中的表现(第一种)情况

    举例: 一个公司一般有多个员工,即一对多关系,那么我们怎么通过API来表现这种关系呢?

    对外模型Dto的编写

    using System;
    
    namespace Routine.Api.Models
    {
        public class EmployeeDto
        {
            public Guid Id { get; set; }
            public Guid CompanyId { get; set; }
            public string EmployeeNo { get; set; }
            public string Name { get; set; }
            public string GenderDisplay { get; set; }
            public int Age { get; set; }
        }
    }

    AutoMapper对象映射关系

    using System;
    using AutoMapper;
    using Routine.Api.Entitle;
    using Routine.Api.Models;
    
    namespace Routine.Api.Profiles
    {
        /// <summary>
        /// 配置 Employee 和 EmployeeDto 对象间的映射关系
        /// </summary>
        public class EmployeeProfile:Profile
        {
            public EmployeeProfile()
            {
                CreateMap<Employee, EmployeeDto>()
                    .ForMember(
                    dest => dest.Name,
                    opt=>opt.MapFrom(src=>$"{src.FirstName} {src.LastName}"))  //姓名
                    .ForMember(
                        dest=>dest.GenderDisplay,
                        opt=>opt.MapFrom(src=>src.Gender.ToString()))          //性别
                    .ForMember(
                        dest=>dest.Age,
                        opt=>opt.MapFrom(src=>DateTime.Now.Year - src.DateOfBirth.Year))  //年龄
                    ;
            }
        }
    }

    API的编写

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using AutoMapper;
    using Microsoft.AspNetCore.Mvc;
    using Routine.Api.Entitle;
    using Routine.Api.Models;
    using Routine.Api.Services;
    
    namespace Routine.Api.Controllers
    {
        [ApiController]
        [Route("api/companies/{companyId}/employees")]
        public class EmployeesController:ControllerBase
        {
            private readonly IMapper _mapper;
            private readonly ICompanyRepository _companyRepository;
    
            public EmployeesController(IMapper mapper,ICompanyRepository companyRepository)
            {
                _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
                _companyRepository = companyRepository ?? throw new ArgumentNullException(nameof(companyRepository));
            }
    
            [HttpGet]
            public async Task<ActionResult<IEnumerable<EmployeeDto>>> GetEmployeeForCompany(Guid companyId)
            {
                if (! await this._companyRepository.CompanyExistsAsync(companyId))
                {
                    return NotFound();
                }
    
                var employees = await this._companyRepository.GetEmployeeAsync(companyId);
    
                return Ok(this._mapper.Map<IEnumerable<EmployeeDto>>(employees));
            }
    
    
        }
    }

    在调用之前我们还需要丰富一下 RoutineDbContext.cs类中的种子数据,种子数据如下:

    
                //Company表种子数据
                modelBuilder.Entity<Company>().HasData(
                    new Company
                    {
                        Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df5923716c"),
                        Name = "Microsoft",
                        Introduction = "Great Company",
                    },
                    new Company
                    {
                        Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716440"),
                        Name = "Google",
                        Introduction = "Don't be evil",
                    },
                    new Company
                    {
                        Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542853"),
                        Name = "Alipapa",
                        Introduction = "Fubao Company",
                    },
                    new Company
                    {
                        Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237100"),
                        Name = "Tencent",
                        Introduction = "From Shenzhen",
                    },
                    new Company
                    {
                        Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716400"),
                        Name = "Baidu",
                        Introduction = "From Beijing",
                    },
                    new Company
                    {
                        Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542800"),
                        Name = "Adobe",
                        Introduction = "Photoshop?",
                    },
                    new Company
                    {
                        Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237111"),
                        Name = "SpaceX",
                        Introduction = "Wow",
                    },
                    new Company
                    {
                        Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716411"),
                        Name = "AC Milan",
                        Introduction = "Football Club",
                    },
                    new Company
                    {
                        Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542811"),
                        Name = "Suning",
                        Introduction = "From Jiangsu",
                    },
                    new Company
                    {
                        Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237122"),
                        Name = "Twitter",
                        Introduction = "Blocked",
                      
                    },
                    new Company
                    {
                        Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716422"),
                        Name = "Youtube",
                        Introduction = "Blocked",
                    },
                    new Company
                    {
                        Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542822"),
                        Name = "360",
                        Introduction = "- -",
                    },
                    new Company
                    {
                        Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237133"),
                        Name = "Jingdong",
                        Introduction = "Brothers",
                    },
                    new Company
                    {
                        Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716433"),
                        Name = "NetEase",
                        Introduction = "Music?",
                    },
                    new Company
                    {
                        Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542833"),
                        Name = "Amazon",
                        Introduction = "Store",
                    },
                    new Company
                    {
                        Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237144"),
                        Name = "AOL",
                        Introduction = "Not Exists?",
                    },
                    new Company
                    {
                        Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716444"),
                        Name = "Yahoo",
                        Introduction = "Who?",
                    },
                    new Company
                    {
                        Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542844"),
                        Name = "Firefox",
                        Introduction = "Is it a company?",
                    });
    
                //Employee 表种子数据
                modelBuilder.Entity<Employee>().HasData(
                    new Employee
                    {
                        Id = Guid.Parse("4b501cb3-d168-4cc0-b375-48fb33f318a4"),
                        CompanyId = Guid.Parse("bbdee09c-089b-4d30-bece-44df5923716c"),
                        DateOfBirth = new DateTime(1976, 1, 2),
                        EmployeeNo = "MSFT231",
                        FirstName = "Nick",
                        LastName = "Carter",
                        Gender = Gender.男
                    },
                    new Employee
                    {
                        Id = Guid.Parse("7eaa532c-1be5-472c-a738-94fd26e5fad6"),
                        CompanyId = Guid.Parse("bbdee09c-089b-4d30-bece-44df5923716c"),
                        DateOfBirth = new DateTime(1981, 12, 5),
                        EmployeeNo = "MSFT245",
                        FirstName = "Vince",
                        LastName = "Carter",
                        Gender = Gender.男
                    },
                    new Employee
                    {
                        Id = Guid.Parse("72457e73-ea34-4e02-b575-8d384e82a481"),
                        CompanyId = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716440"),
                        DateOfBirth = new DateTime(1986, 11, 4),
                        EmployeeNo = "G003",
                        FirstName = "Mary",
                        LastName = "King",
                        Gender = Gender.女
                    },
                    new Employee
                    {
                        Id = Guid.Parse("7644b71d-d74e-43e2-ac32-8cbadd7b1c3a"),
                        CompanyId = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716440"),
                        DateOfBirth = new DateTime(1977, 4, 6),
                        EmployeeNo = "G097",
                        FirstName = "Kevin",
                        LastName = "Richardson",
                        Gender = Gender.男
                    },
                    new Employee
                    {
                        Id = Guid.Parse("679dfd33-32e4-4393-b061-f7abb8956f53"),
                        CompanyId = Guid.Parse("5efc910b-2f45-43df-afae-620d40542853"),
                        DateOfBirth = new DateTime(1967, 1, 24),
                        EmployeeNo = "A009",
                        FirstName = "卡",
                        LastName = "里",
                        Gender = Gender.女
                    },
                    new Employee
                    {
                        Id = Guid.Parse("1861341e-b42b-410c-ae21-cf11f36fc574"),
                        CompanyId = Guid.Parse("5efc910b-2f45-43df-afae-620d40542853"),
                        DateOfBirth = new DateTime(1957, 3, 8),
                        EmployeeNo = "A404",
                        FirstName = "Not",
                        LastName = "Man",
                        Gender = Gender.男
                    });
    

    数据准备好了之后,我们还需要进行一下数据的迁移操作,我们需要在Nuget控制台中执行下列命令,进行种子数据的迁移工作.

    add-Migration AddEmployeeData

    迁移完成只有会在项目中生成一下迁移描述的文件.

    迁移快照描述类
    迁移快照描述类

    完成上述步骤之后,我们启动项目完成迁移,并验证在API中查询父子关系的数据是否正确.
    迁移到Employee表的数据信息如下:
    迁移结果

    查询指定公司下的所有员工,API调用结果:

    调用结果
    调用结果

    父子关系的数据在API中的表现(第二种)情况

    我们也可以编写查询指定公司下的指定员工信息的接口,代码如下:

    [HttpGet("{employeeId}")]
    public async Task<ActionResult<EmployeeDto>> GetEmployeeForCompany(Guid companyId, Guid employeeId)
    {
        if (!await this._companyRepository.CompanyExistsAsync(companyId))
        {
            return NotFound();
        }
        
    	if (employee == null)
        {
            return NotFound();
        }
    	
        var employee = await this._companyRepository.GetEmployeeAsync(companyId,employeeId);
    
        return Ok(this._mapper.Map<EmployeeDto>(employee));
    }

    查询指定公司下的指定员工,API调用结果:

    调用结果
    调用结果

  • 相关阅读:
    MongoDB 分片机制
    MongoDb的“not master and slaveok=false”错误及解决方法
    MongoDB 副本集复制配置
    spring,mybatis整合配置文件
    Tomcat-正统的类加载器架构
    CSS3系列三(与背景边框相关样式 、变形处理、动画效果)
    如果您想省略JS里的分号,了解一下JS的分号插入原理吧
    CSS3系列二(媒体支持、文字与字体相关样式、盒相关样式)
    CSS3系列一(概述、选择器、使用选择器插入内容)
    HTML5系列四(WebWorker、地理定位)
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12674187.html
Copyright © 2011-2022 走看看