在控制器型 API 與基本 API 之間進行選擇

注意

這不是這篇文章的最新版本。 如需目前版本,請參閱本文的 .NET 8 版本

重要

這些發行前產品的相關資訊在產品正式發行前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

如需目前版本,請參閱本文的 .NET 8 版本

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 尚未支援或實作。 包括:

另請參閱

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 尚未支援或實作。 包括:

另請參閱