Есть ли у вас опыт разработки API на C# с использованием ASP.NET Core?

«Есть ли у вас опыт разработки API на C# с использованием ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, есть опыт создания production-ready RESTful API на ASP.NET Core.

Архитектурный подход: Часто использую подход с контроллерами, разделяя логику на слои (Controllers -> Services -> Repositories). Для небольших API или микросервисов отлично подходит Minimal API.

Пример Minimal API с ключевыми практиками:

var builder = WebApplication.CreateBuilder(args);

// Регистрация сервисов
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
builder.Services.AddScoped<IProductService, ProductService>(); // Слой бизнес-логики
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); // Документация API

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

// Endpoint для получения всех продуктов
app.MapGet("/api/products", async (IProductService productService) =>
    await productService.GetAllAsync())
    .Produces<List<ProductDto>>(StatusCodes.Status200OK)
    .WithTags("Products");

// Endpoint для создания продукта с валидацией
app.MapPost("/api/products", async (ProductCreateDto dto, IProductService productService) =>
{
    var createdProduct = await productService.CreateAsync(dto);
    return Results.Created($"/api/products/{createdProduct.Id}", createdProduct);
})
.Produces<ProductDto>(StatusCodes.Status201Created)
.Produces<ValidationProblemDetails>(StatusCodes.Status400BadRequest) // Автоматическая валидация
.WithTags("Products");

app.Run();

Ключевые аспекты опыта:

  • Аутентификация и авторизация: Настройка JWT Bearer-токенов, политик на основе ролей или утверждений (Claims).
  • Работа с данными: Entity Framework Core (Code-First/Migrations), репозитории, Unit of Work, DTOs (AutoMapper/Mapster).
  • Обработка ошибок: Глобальный обработчик исключений через middleware, возврат структурированных ошибок (ProblemDetails).
  • Производительность: Асинхронные методы (async/await), пагинация, кеширование ответов ([ResponseCache]), компрессия.
  • Документация: Интеграция Swagger/OpenAPI с аннотациями для описания моделей и кодов ответов.
  • Тестирование: Написание интеграционных тестов с WebApplicationFactory и модульных тестов для сервисов.