
























Program.cs
if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI( options => { foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions) { options.SwaggerEndpoint( $"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); } }); }
using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc; using SampleWebApiAspNetCore.Dtos; using SampleWebApiAspNetCore.Entities; using SampleWebApiAspNetCore.Helpers; using SampleWebApiAspNetCore.Services; using SampleWebApiAspNetCore.Models; using SampleWebApiAspNetCore.Repositories; using System.Text.Json; using MapsterMapper; namespace SampleWebApiAspNetCore.Controllers.v1 { [ApiController] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]")] public class FoodsController : ControllerBase { private readonly IFoodRepository _foodRepository; private readonly IMapper _mapper; private readonly ILinkService<FoodsController> _linkService; public FoodsController( IFoodRepository foodRepository, IMapper mapper, ILinkService<FoodsController> linkService) { _foodRepository = foodRepository; _mapper = mapper; _linkService = linkService; } [HttpGet(Name = nameof(GetAllFoods))] public ActionResult GetAllFoods(ApiVersion version, [FromQuery] QueryParameters queryParameters) { List<FoodEntity> foodItems = _foodRepository.GetAll(queryParameters).ToList(); var allItemCount = _foodRepository.Count(); var paginationMetadata = new { totalCount = allItemCount, pageSize = queryParameters.PageCount, currentPage = queryParameters.Page, totalPages = queryParameters.GetTotalPages(allItemCount) }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata)); var links = _linkService.CreateLinksForCollection(queryParameters, allItemCount, version); var toReturn = foodItems.Select(x => _linkService.ExpandSingleFoodItem(x, x.Id, version)); return Ok(new { value = toReturn, links = links }); } [HttpGet] [Route("{id:int}", Name = nameof(GetSingleFood))] public ActionResult GetSingleFood(ApiVersion version, int id) { FoodEntity foodItem = _foodRepository.GetSingle(id); if (foodItem == null) { return NotFound(); } FoodDto item = _mapper.Map<FoodDto>(foodItem); return Ok(_linkService.ExpandSingleFoodItem(item, item.Id, version)); } [HttpPost(Name = nameof(AddFood))] public ActionResult<FoodDto> AddFood(ApiVersion version, [FromBody] FoodCreateDto foodCreateDto) { if (foodCreateDto == null) { return BadRequest(); } FoodEntity toAdd = _mapper.Map<FoodEntity>(foodCreateDto); _foodRepository.Add(toAdd); if (!_foodRepository.Save()) { throw new Exception("Creating a fooditem failed on save."); } FoodEntity newFoodItem = _foodRepository.GetSingle(toAdd.Id); FoodDto foodDto = _mapper.Map<FoodDto>(newFoodItem); return CreatedAtRoute(nameof(GetSingleFood), new { version = version.ToString(), id = newFoodItem.Id }, _linkService.ExpandSingleFoodItem(foodDto, foodDto.Id, version)); } [HttpPatch("{id:int}", Name = nameof(PartiallyUpdateFood))] public ActionResult<FoodDto> PartiallyUpdateFood(ApiVersion version, int id, [FromBody] JsonPatchDocument<FoodUpdateDto> patchDoc) { if (patchDoc == null) { return BadRequest(); } FoodEntity existingEntity = _foodRepository.GetSingle(id); if (existingEntity == null) { return NotFound(); } FoodUpdateDto foodUpdateDto = _mapper.Map<FoodUpdateDto>(existingEntity); patchDoc.ApplyTo(foodUpdateDto); TryValidateModel(foodUpdateDto); if (!ModelState.IsValid) { return BadRequest(ModelState); } _mapper.Map(foodUpdateDto, existingEntity); FoodEntity updated = _foodRepository.Update(id, existingEntity); if (!_foodRepository.Save()) { throw new Exception("Updating a fooditem failed on save."); } FoodDto foodDto = _mapper.Map<FoodDto>(updated); return Ok(_linkService.ExpandSingleFoodItem(foodDto, foodDto.Id, version)); } [HttpDelete] [Route("{id:int}", Name = nameof(RemoveFood))] public ActionResult RemoveFood(int id) { FoodEntity foodItem = _foodRepository.GetSingle(id); if (foodItem == null) { return NotFound(); } _foodRepository.Delete(id); if (!_foodRepository.Save()) { throw new Exception("Deleting a fooditem failed on save."); } return NoContent(); } [HttpPut] [Route("{id:int}", Name = nameof(UpdateFood))] public ActionResult<FoodDto> UpdateFood(ApiVersion version, int id, [FromBody] FoodUpdateDto foodUpdateDto) { if (foodUpdateDto == null) { return BadRequest(); } var existingFoodItem = _foodRepository.GetSingle(id); if (existingFoodItem == null) { return NotFound(); } _mapper.Map(foodUpdateDto, existingFoodItem); _foodRepository.Update(id, existingFoodItem); if (!_foodRepository.Save()) { throw new Exception("Updating a fooditem failed on save."); } FoodDto foodDto = _mapper.Map<FoodDto>(existingFoodItem); return Ok(_linkService.ExpandSingleFoodItem(foodDto, foodDto.Id, version)); } [HttpGet("GetRandomMeal", Name = nameof(GetRandomMeal))] public ActionResult GetRandomMeal() { ICollection<FoodEntity> foodItems = _foodRepository.GetRandomMeal(); IEnumerable<FoodDto> dtos = foodItems.Select(x => _mapper.Map<FoodDto>(x)); var links = new List<LinkDto>(); // self links.Add(new LinkDto(Url.Link(nameof(GetRandomMeal), null), "self", "GET")); return Ok(new { value = dtos, links = links }); } } }

using Microsoft.AspNetCore.Mvc; namespace SampleWebApiAspNetCore.Controllers.v2 { [ApiController] [ApiVersion("2.0")] [Route("api/v{version:apiVersion}/[controller]")] public class FoodsController : ControllerBase { [HttpGet] public ActionResult Get() { return Ok("2.0"); } } }

项目源码:https://github.com/FabianGosebrink/ASPNETCore-WebAPI-Sample.git
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。