前言
如果你使用过其他一些轻量级Web框架,比如Node.JS,你就会知道,创建具有最小依赖项的HTTP API是多么简单:
var express = require('express')
var app = express()app.get('/', function (req, res) {res.send('hello My IO!')
})app.listen(3000)
而现在,使用.NET 6,我们也可以在ASP.NET Core中创建仅包括最少文件、功能和依赖项的最小Web API。
最小Web API
要实现上面相同的功能,只需要三行代码:
var app = WebApplication.Create(args);app.MapGet("/", () => "hello My IO!");app.Run();
首先,创建一个WebApplication实例;
然后,使用
MapGet
方法配置了一个最小Web API端点;最后,使用
Run
方法启动Web API应用程序。
但是,要在生产环境下使用的API不可能这么简单,至少需要处理依赖项和中间件。
Demo
1.使用模板
打开Visual Studio 2022,创建新项目,选择“ASP.NET Core Web API”项目模板:
可以看到Use controllers
选项默认选中的,取消该选项,则会创建最小Web API。
2.代码结构
相较于VS2019生成的项目结构,文件精简了,而且代码量也少很多:
var builder = WebApplication.CreateBuilder(args);// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();var summaries = new[]
{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};app.MapGet("/weatherforecast", () =>
{var forecast = Enumerable.Range(1, 5).Select(index =>new WeatherForecast(DateTime.Now.AddDays(index),Random.Shared.Next(-20, 55),summaries[Random.Shared.Next(summaries.Length)])).ToArray();return forecast;
})
.WithName("GetWeatherForecast");app.Run();internal record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
{public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
相较于以前我们使用两个单独的文件Program.cs和Startup.cs来配置应用程序托管和启动。现在,全部都在Program.cs中实现:
在WebApplicationBuilder实例上使用
Addxxx
方法向DI容器注册特定服务,类似Startup类的ConfigureServices方法实现。在WebApplication实例上使用
Usexxx
方法将一系列中间件加入到HTTP管道,类似Startup类的Configure方法实现。
DTO使用
record
定义,而且也放在同一个Program.cs文件中。
3.功能演示
现在我们运行应用程序,Visual Studio 2022默认使用 Kestrel Web服务器,而不是IIS Express。
最小Web API默认已经集成了Swagger,我们可以直接在这里验证API是否工作正常:
结论
作为要在生产环境下使用的API,随着项目需求和复杂性的增加,单个文件会变得非常臃肿。
因此,将不同功能代码分解到不同的层和文件中肯定是必然的结果。
目前来说,最小Web API仅用于快速创建演示项目,而对生产项目使用自定义模板,可能是较好的选择。