ASP.NET Core: Chọn giữa API dựa trên controller và API tối thiểu
ASP.NET Core hỗ trợ hai cách tiếp cận để tạo API: cách tiếp cận dựa trên controller và các API tối thiểu (Minimal API). Controller trong một dự án API là các lớp bắt nguồn từ ControllerBase. API tối thiểu xác định điểm cuối bằng trình xử lý logic trong lambda hoặc phương thức. Bài viết này chỉ ra sự khác biệt giữa hai cách tiếp cận.
Theo mặc định, thiết kế của các API tối thiểu sẽ ẩn lớp máy chủ và tập trung vào cấu hình cũng như khả năng mở rộng thông qua các phương thức mở rộng lấy các hàm làm biểu thức lambda. Controller là các lớp có thể nhận các dependency thông qua phép nội xạ hàm tạo hoặc nội xạ property và thường tuân theo các mẫu hướng đối tượng. API tối thiểu hỗ trợ Dependency Injection thông qua các phương pháp khác như truy cập nhà cung cấp dịch vụ.
Đây là code mẫu cho API dựa trên controller:
namespace APIWithControllers;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
}
}
using Microsoft.AspNetCore.Mvc;
namespace APIWithControllers.Controllers;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
Đoạn code sau cung cấp chức năng tương tự trong một dự án API tối thiểu. Lưu ý rằng cách tiếp cận API tối thiểu liên quan đến việc đưa code liên quan vào biểu thức lambda.
namespace MinimalAPI;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseHttpsRedirection();
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", (HttpContext httpContext) =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = summaries[Random.Shared.Next(summaries.Length)]
})
.ToArray();
return forecast;
});
app.Run();
}
}
Cả hai dự án API đều đề cập đến lớp sau:
namespace APIWithControllers;
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}
API tối thiểu có nhiều khả năng giống như API dựa trên controller. Chúng hỗ trợ cấu hình và tùy chỉnh cần thiết để mở rộng quy mô cho nhiều API, xử lý các route phức tạp, áp dụng quy tắc ủy quyền và kiểm soát nội dung của phản hồi API. Có một vài khả năng có sẵn với các API dựa trên controller chưa được hỗ trợ hoặc triển khai bởi các API tối thiểu. Bao gồm những điều sau:
- Không hỗ trợ tích hợp sẵn cho liên kết mô hình (IModelBinderProvider, IModelBinder). Hỗ trợ có thể được thêm vào với một shim ràng buộc tùy chỉnh.
- Không hỗ trợ tích hợp để xác thực (IModelValidator).
- Không hỗ trợ cho các bộ phận ứng dụng hoặc mô hình ứng dụn. Không có cách nào để áp dụng hoặc xây dựng quy ước của riêng bạn.
- Không hỗ trợ kết xuất chế độ xem tích hợp. Chúng tôi khuyên bạn nên sử dụng Razor Pages để hiển thị view.
- Không hỗ trợ cho JsonPatch
- Không hỗ trợ cho OData
Xem thêm
- Tạo API web với ASP.NET Core.
- Hướng dẫn: Tạo API web với ASP.NET Core
- Tổng quan về API tối thiểu
- Hướng dẫn: Tạo API tối thiểu với ASP.NET Core