Denetleyici tabanlı API'ler ile en düşük API'ler arasında seçim yapma

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

ASP.NET Core, API oluşturmaya yönelik iki yaklaşımı destekler: denetleyici tabanlı bir yaklaşım ve en düşük API'ler. BIR API projesindeki denetleyiciler, 'den ControllerBasetüretilen sınıflardır. Minimum API'ler , lambda veya yöntemlerdeki mantıksal işleyicilerle uç noktaları tanımlar. Bu makalede iki yaklaşım arasındaki farklar gösterilmektedir.

Minimum API'lerin tasarımı, konak sınıfını varsayılan olarak gizler ve işlevleri lambda ifadeleri olarak alan uzantı yöntemleri aracılığıyla yapılandırma ve genişletilebilirlik konularına odaklanır. Denetleyiciler, oluşturucu ekleme veya özellik ekleme yoluyla bağımlılıkları alabilen ve genellikle nesne odaklı desenleri izleyen sınıflardır. En düşük API'ler, hizmet sağlayıcısına erişme gibi diğer yaklaşımlar aracılığıyla bağımlılık eklemeyi destekler.

Denetleyiciler temelinde bir API için örnek kod aşağıda verilmiştir:


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

Aşağıdaki kod, en düşük API projesinde aynı işlevselliği sağlar. Minimum API yaklaşımının lambda ifadelerine ilgili kodu dahil ettiğini görebilirsiniz.


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

Her iki API projesi de aşağıdaki sınıfa başvurur:

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

En düşük API'ler, denetleyici tabanlı API'lerle aynı özelliklere sahiptir. Birden çok API'ye ölçeklendirmek, karmaşık yolları işlemek, yetkilendirme kuralları uygulamak ve API yanıtlarının içeriğini denetlemek için gereken yapılandırmayı ve özelleştirmeyi destekler. Henüz desteklenmeyen veya en düşük API'ler tarafından uygulanmayan denetleyici tabanlı API'lerde kullanılabilen birkaç özellik vardır. Bu modüller şunlardır:

Ayrıca bkz.

ASP.NET Core, API oluşturmaya yönelik iki yaklaşımı destekler: denetleyici tabanlı bir yaklaşım ve en düşük API'ler. BIR API projesindeki denetleyiciler, 'den ControllerBasetüretilen sınıflardır. Minimum API'ler , lambda veya yöntemlerdeki mantıksal işleyicilerle uç noktaları tanımlar. Bu makalede iki yaklaşım arasındaki farklar gösterilmektedir.

Minimum API'lerin tasarımı, konak sınıfını varsayılan olarak gizler ve işlevleri lambda ifadeleri olarak alan uzantı yöntemleri aracılığıyla yapılandırma ve genişletilebilirlik konularına odaklanır. Denetleyiciler, oluşturucu ekleme veya özellik ekleme yoluyla bağımlılıkları alabilen ve genellikle nesne odaklı desenleri izleyen sınıflardır. En düşük API'ler, hizmet sağlayıcısına erişme gibi diğer yaklaşımlar aracılığıyla bağımlılık eklemeyi destekler.

Denetleyiciler temelinde bir API için örnek kod aşağıda verilmiştir:


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

Aşağıdaki kod, en düşük API projesinde aynı işlevselliği sağlar. Minimum API yaklaşımının lambda ifadelerine ilgili kodu dahil ettiğini görebilirsiniz.


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

Her iki API projesi de aşağıdaki sınıfa başvurur:

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

En düşük API'ler, denetleyici tabanlı API'lerle aynı özelliklere sahiptir. Birden çok API'ye ölçeklendirmek, karmaşık yolları işlemek, yetkilendirme kuralları uygulamak ve API yanıtlarının içeriğini denetlemek için gereken yapılandırmayı ve özelleştirmeyi destekler. Henüz desteklenmeyen veya en düşük API'ler tarafından uygulanmayan denetleyici tabanlı API'lerde kullanılabilen birkaç özellik vardır. Bu modüller şunlardır:

Ayrıca bkz.