.NET 8 Minimal API 入门示例
.NET 6 之后推出了 Minimal API,写接口不用再建 Controller 类,一个文件就能跑起来。刚开始觉得这只是个语法糖,真用它写了几个小接口之后,发现对简单场景确实方便很多。这篇笔记记录我用 Minimal API 写一个待办事项接口的过程。
一、最小可运行示例
新建一个项目后,Program.cs 可以写成这样:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello, Minimal API!");
app.Run();
就这么几行,一个 Web 服务就起来了。对比以前要建 Startup、Controller、Model 一堆类,这个启动速度对小工具来说太友好了。
二、写一个待办事项接口
先定义一个模型:
record Todo(int Id, string Title, bool Done);
var todos = new List<Todo>
{
new(1, "学习 Minimal API", false),
new(2, "整理笔记", false)
};
然后写接口:
// 查询全部
app.MapGet("/todos", () => todos);
// 按 id 查询
app.MapGet("/todos/{id}", (int id) =>
todos.FirstOrDefault(t => t.Id == id) is Todo t
? Results.Ok(t)
: Results.NotFound());
// 新增
app.MapPost("/todos", (Todo todo) =>
{
todos.Add(todo);
return Results.Created($"/todos/{todo.Id}", todo);
});
三、和传统 Controller 的对比
- 代码量更少:不需要建类、加特性、继承 ControllerBase,路由直接写在 lambda 上。
- 适合简单接口:小工具、内部服务、原型开发用 Minimal API 很顺手。
- 复杂业务还是 Controller 合适:需要模型验证、过滤器、区域划分时,Controller 的结构更清晰。
四、依赖注入在 Minimal API 里怎么用
直接在委托参数里加服务类型,框架会自动注入:
app.MapGet("/time", (IDateTimeProvider clock) =>
clock.Now);
这个写法比在 Controller 构造函数里写一长串参数清爽不少,而且路由和参数绑定在一处,可读性很好。
五、小结
Minimal API 不是要取代 Controller,而是给简单场景一个更轻量的选择。学习下来感觉它特别适合写小工具和接口原型,复杂的企业项目还是建议用传统的分层结构。后面打算用它写个个人用的小 API,再补充一篇实践笔记。