MVC (Model-View-Controller) 是一种软件架构模式,将应用程序分为三个主要组件:
在ASP.NET Web API中,虽然View部分通常不用于返回HTML,但MVC模式仍然适用,主要关注Controller和Model。
/Controllers
/Models
/DTOs (Data Transfer Objects)
/Services
/Repositories
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly IProductService _productService;
public ProductsController(IProductService productService)
{
_productService = productService;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<ProductDto>>> GetProducts()
{
var products = await _productService.GetAllProductsAsync();
return Ok(products);
}
[HttpGet("{id}")]
public async Task<ActionResult<ProductDto>> GetProduct(int id)
{
var product = await _productService.GetProductByIdAsync(id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
[HttpPost]
public async Task<ActionResult<ProductDto>> CreateProduct([FromBody] CreateProductDto productDto)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var createdProduct = await _productService.CreateProductAsync(productDto);
return CreatedAtAction(nameof(GetProduct), new { id = createdProduct.Id }, createdProduct);
}
}
public class ProductDto
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
}
public class CreateProductDto
{
[Required]
[StringLength(100)]
public string Name { get; set; }
[Range(0.01, 10000)]
public decimal Price { get; set; }
[StringLength(500)]
public string Description { get; set; }
}
public interface IProductService
{
Task<IEnumerable<ProductDto>> GetAllProductsAsync();
Task<ProductDto> GetProductByIdAsync(int id);
Task<ProductDto> CreateProductAsync(CreateProductDto productDto);
}
public class ProductService : IProductService
{
private readonly IProductRepository _repository;
private readonly IMapper _mapper;
public ProductService(IProductRepository repository, IMapper mapper)
{
_repository = repository;
_mapper = mapper;
}
public async Task<IEnumerable<ProductDto>> GetAllProductsAsync()
{
var products = await _repository.GetAllAsync();
return _mapper.Map<IEnumerable<ProductDto>>(products);
}
// 其他方法实现...
}
public class ProductProfile : Profile
{
public ProductProfile()
{
CreateMap<Product, ProductDto>();
CreateMap<CreateProductDto, Product>();
}
}
原因:实体间相互引用导致序列化失败
解决方案:
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
原因:模型验证未正确配置
解决方案:
[ApiController]
属性自动处理验证ModelState.IsValid
原因:N+1查询问题或大对象图
解决方案:
[HttpGet]
public async Task<ActionResult<IEnumerable<ProductDto>>> GetProducts([FromQuery] int page = 1, [FromQuery] int pageSize = 10)
{
var products = await _productService.GetProductsPagedAsync(page, pageSize);
return Ok(products);
}
通过遵循这些最佳实践,您可以在ASP.NET中构建结构良好、可维护且高效的API。
没有搜到相关的沙龙