在控制器型 API 與基本 API 之間進行選擇
注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
ASP.NET Core 支援兩種方法來建立 API: 控制器型方法和最少的 API。 API 專案中的「控制器」是衍生自 ControllerBase 的類別。 「基本 API」在 Lambda 或方法中使用邏輯處理常式定義端點。 本文指出這兩種方法之間的差異。
基本 API 的設計預設會隱藏主機類別,並著重於經由採用函式作為 Lambda 運算式的擴充方法進行設定和擴充。 控制器是可透過建構函式插入或屬性插入採用相依性的類別,而且通常遵循物件導向模式。 基本 API 可透過其他方法支援相依性插入,例如存取服務提供者。
以下是以控制器為基礎的 API 範例程式碼:
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();
}
}
下列程式碼在基本 API 專案中提供相同的功能。 請注意,基本 API 方法涉及在 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();
}
}
這兩個 API 專案都參考下列類別:
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 有許多與控制器型 API 相同的功能。 其支援調整為多個 API、處理複雜路由、套用授權規則,以及控制 API 回應內容所需的設定和自訂。 有一些功能可供控制器型 API 使用,但基本 API 尚未支援或實作。 包括:
- 沒有模型繫結的內建支援 (IModelBinderProvider、IModelBinder)。 可以使用自訂繫結填充碼來新增支援。
- 沒有驗證的內建支援 (IModelValidator)。
- 不支援應用程式組件或應用程式模型。 無法套用或建置您自己的慣例。
- 沒有內建檢視轉譯支援。 我們建議使用 Razor Pages 來轉譯檢視。
- 不支援 JsonPatch
- 不支援 OData
另請參閱
ASP.NET Core 支援兩種方法來建立 API: 控制器型方法和最少的 API。 API 專案中的「控制器」是衍生自 ControllerBase 的類別。 「基本 API」在 Lambda 或方法中使用邏輯處理常式定義端點。 本文指出這兩種方法之間的差異。
基本 API 的設計預設會隱藏主機類別,並著重於經由採用函式作為 Lambda 運算式的擴充方法進行設定和擴充。 控制器是可透過建構函式插入或屬性插入採用相依性的類別,而且通常遵循物件導向模式。 基本 API 可透過其他方法支援相依性插入,例如存取服務提供者。
以下是以控制器為基礎的 API 範例程式碼:
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();
}
}
下列程式碼在基本 API 專案中提供相同的功能。 請注意,基本 API 方法涉及在 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();
}
}
這兩個 API 專案都參考下列類別:
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 有許多與控制器型 API 相同的功能。 其支援調整為多個 API、處理複雜路由、套用授權規則,以及控制 API 回應內容所需的設定和自訂。 有一些功能可供控制器型 API 使用,但基本 API 尚未支援或實作。 包括:
- 沒有模型繫結的內建支援 (IModelBinderProvider、IModelBinder)。 可以使用自訂繫結填充碼來新增支援。
- 不支援從表單繫結。 這包括繫結 IFormFile。
- 沒有驗證的內建支援 (IModelValidator)。
- 不支援應用程式組件或應用程式模型。 無法套用或建置您自己的慣例。
- 沒有內建檢視轉譯支援。 我們建議使用 Razor Pages 來轉譯檢視。
- 不支援 JsonPatch
- 不支援 OData