コントローラー ベースの API と最小 API のどちらかを選択する

注意

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

ASP.NET Core では、API を作成するための方法として、コントローラー ベースのアプローチと最小 API の 2 つがサポートされています。 API プロジェクトでの "コントローラー" とは、ControllerBase から派生するクラスです。 "最小 API" では、ラムダまたはメソッドで論理ハンドラーを使用してエンドポイントを定義します。 この記事では、2 つのアプローチの違いについて説明します。

最小 API の設計では、ホスト クラスは既定では隠ぺいされ、ラムダ式として関数を受け取る拡張メソッドによる構成と拡張性に重点が置かれます。 コントローラーは、コンストラクターの挿入またはプロパティの挿入を介して依存関係を受け取ることができるクラスであり、通常はオブジェクト指向のパターンに従います。 最小 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 のアプローチでは、関連するコードがラムダ式に含まれることに注意してください。


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 では使用できます。 これには以下が含まれます。

  • モデル バインド (IModelBinderProviderIModelBinder) の組み込みサポートはありません。 カスタムのバインディング shim を使用することにより、サポートを追加することができます。
  • 検証 (IModelValidator) の組み込みサポートはありません。
  • アプリケーション パーツ または アプリケーション モデル はサポートされていません。 独自の規則を適用または構築することはできません。
  • 組み込みのビューのレンダリングはサポートされていません。 ビューのレンダリングには、Razor Pages を使用することをお勧めします。
  • JsonPatch はサポートされていません。
  • OData はサポートされていません。

関連項目

ASP.NET Core では、API を作成するための方法として、コントローラー ベースのアプローチと最小 API の 2 つがサポートされています。 API プロジェクトでの "コントローラー" とは、ControllerBase から派生するクラスです。 "最小 API" では、ラムダまたはメソッドで論理ハンドラーを使用してエンドポイントを定義します。 この記事では、2 つのアプローチの違いについて説明します。

最小 API の設計では、ホスト クラスは既定では隠ぺいされ、ラムダ式として関数を受け取る拡張メソッドによる構成と拡張性に重点が置かれます。 コントローラーは、コンストラクターの挿入またはプロパティの挿入を介して依存関係を受け取ることができるクラスであり、通常はオブジェクト指向のパターンに従います。 最小 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 のアプローチでは、関連するコードがラムダ式に含まれることに注意してください。


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 では使用できます。 これには以下が含まれます。

  • モデル バインド (IModelBinderProviderIModelBinder) の組み込みサポートはありません。 カスタムのバインディング shim を使用することにより、サポートを追加することができます。
  • フォームからのバインドはサポートされません。 これには、IFormFile のバインドが含まれます。
  • 検証 (IModelValidator) の組み込みサポートはありません。
  • アプリケーション パーツ または アプリケーション モデル はサポートされていません。 独自の規則を適用または構築することはできません。
  • 組み込みのビューのレンダリングはサポートされていません。 ビューのレンダリングには、Razor Pages を使用することをお勧めします。
  • JsonPatch はサポートされていません。
  • OData はサポートされていません。

関連項目