Выбор между API на основе контроллера и минимальными API
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 9 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
ASP.NET Core поддерживает два подхода к созданию API: подход на основе контроллера и минимальные API. Контроллеры в проекте API — это классы , производные от ControllerBase. Минимальные API определяют конечные точки с логическими обработчиками в лямбда-кодах или методах. В этой статье приводятся различия между двумя подходами.
Проектирование минимальных 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. Например:
- Встроенная поддержка привязки модели (IModelBinderProvider,). IModelBinder Эту поддержку можно добавить с помощью пользовательской оболочки привязки.
- Встроенная поддержка проверки (IModelValidator).
- Нет поддержки частей приложения или модели приложения. Невозможно применить или создать собственные соглашения.
- Нет встроенной поддержки отрисовки представления. Для отображения представлений мы рекомендуем использовать страницы Razor.
- Нет поддержки JsonPatch.
- Нет поддержки OData.
См. также
ASP.NET Core поддерживает два подхода к созданию API: подход на основе контроллера и минимальные API. Контроллеры в проекте API — это классы , производные от ControllerBase. Минимальные API определяют конечные точки с логическими обработчиками в лямбда-кодах или методах. В этой статье приводятся различия между двумя подходами.
Проектирование минимальных 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. Например:
- Встроенная поддержка привязки модели (IModelBinderProvider,). IModelBinder Эту поддержку можно добавить с помощью пользовательской оболочки привязки.
- Привязка из форм не поддерживается, в том числе привязка IFormFile.
- Встроенная поддержка проверки (IModelValidator).
- Нет поддержки частей приложения или модели приложения. Невозможно применить или создать собственные соглашения.
- Нет встроенной поддержки отрисовки представления. Для отображения представлений мы рекомендуем использовать страницы Razor.
- Нет поддержки JsonPatch.
- Нет поддержки OData.
См. также
ASP.NET Core