Pilih antara API berbasis pengontrol dan API minimal

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

ASP.NET Core mendukung dua pendekatan untuk membuat API: pendekatan berbasis pengontrol dan API minimal. Pengontrol dalam proyek API adalah kelas yang berasal dari ControllerBase. API minimal mendefinisikan titik akhir dengan handler logis dalam lambda atau metode. Artikel ini menunjukkan perbedaan antara kedua pendekatan.

Desain API minimal menyembunyikan kelas host secara default dan berfokus pada konfigurasi dan ekstensibilitas melalui metode ekstensi yang berfungsi sebagai ekspresi lambda. Pengontrol adalah kelas yang dapat mengambil dependensi melalui injeksi konstruktor atau injeksi properti, dan umumnya mengikuti pola berorientasi objek. API minimal mendukung injeksi dependensi melalui pendekatan lain seperti mengakses penyedia layanan.

Berikut adalah kode sampel untuk API berdasarkan pengontrol:


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();
    }
}

Kode berikut menyediakan fungsionalitas yang sama dalam proyek API minimal. Perhatikan bahwa pendekatan API minimal melibatkan termasuk kode terkait dalam ekspresi 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();
    }
}

Kedua proyek API merujuk ke kelas berikut:

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 minimal memiliki banyak kemampuan yang sama dengan API berbasis pengontrol. Mereka mendukung konfigurasi dan kustomisasi yang diperlukan untuk menskalakan ke beberapa API, menangani rute kompleks, menerapkan aturan otorisasi, dan mengontrol konten respons API. Ada beberapa kemampuan yang tersedia dengan API berbasis pengontrol yang belum didukung atau diimplementasikan oleh API minimal. Ini termasuk:

  • Tidak ada dukungan bawaan untuk pengikatan model (IModelBinderProvider, IModelBinder). Dukungan dapat ditambahkan dengan shim pengikatan kustom.
  • Tidak ada dukungan bawaan untuk validasi (IModelValidator).
  • Tidak ada dukungan untuk bagian aplikasi atau model aplikasi. Tidak ada cara untuk menerapkan atau membangun konvensi Anda sendiri.
  • Tidak ada dukungan penyajian tampilan bawaan. Sebaiknya gunakan Razor Halaman untuk menyajikan tampilan.
  • Tidak ada dukungan untuk JsonPatch
  • Tidak ada dukungan untuk OData

Lihat juga

ASP.NET Core mendukung dua pendekatan untuk membuat API: pendekatan berbasis pengontrol dan API minimal. Pengontrol dalam proyek API adalah kelas yang berasal dari ControllerBase. API minimal mendefinisikan titik akhir dengan handler logis dalam lambda atau metode. Artikel ini menunjukkan perbedaan antara kedua pendekatan.

Desain API minimal menyembunyikan kelas host secara default dan berfokus pada konfigurasi dan ekstensibilitas melalui metode ekstensi yang berfungsi sebagai ekspresi lambda. Pengontrol adalah kelas yang dapat mengambil dependensi melalui injeksi konstruktor atau injeksi properti, dan umumnya mengikuti pola berorientasi objek. API minimal mendukung injeksi dependensi melalui pendekatan lain seperti mengakses penyedia layanan.

Berikut adalah kode sampel untuk API berdasarkan pengontrol:


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();
    }
}

Kode berikut menyediakan fungsionalitas yang sama dalam proyek API minimal. Perhatikan bahwa pendekatan API minimal melibatkan termasuk kode terkait dalam ekspresi 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();
    }
}

Kedua proyek API merujuk ke kelas berikut:

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 minimal memiliki banyak kemampuan yang sama dengan API berbasis pengontrol. Mereka mendukung konfigurasi dan kustomisasi yang diperlukan untuk menskalakan ke beberapa API, menangani rute kompleks, menerapkan aturan otorisasi, dan mengontrol konten respons API. Ada beberapa kemampuan yang tersedia dengan API berbasis pengontrol yang belum didukung atau diimplementasikan oleh API minimal. Ini termasuk:

  • Tidak ada dukungan bawaan untuk pengikatan model (IModelBinderProvider, IModelBinder). Dukungan dapat ditambahkan dengan shim pengikatan kustom.
  • Tidak ada dukungan untuk mengikat dari formulir. Ini termasuk pengikatan IFormFile.
  • Tidak ada dukungan bawaan untuk validasi (IModelValidator).
  • Tidak ada dukungan untuk bagian aplikasi atau model aplikasi. Tidak ada cara untuk menerapkan atau membangun konvensi Anda sendiri.
  • Tidak ada dukungan penyajian tampilan bawaan. Sebaiknya gunakan Razor Halaman untuk menyajikan tampilan.
  • Tidak ada dukungan untuk JsonPatch
  • Tidak ada dukungan untuk OData

Lihat juga