1. 每天手工搭建WebAPI项目,到底浪费了多少时间
先抛一个我自己的数据:一个标准的企业级WebAPI项目,从新建解决方案开始,到把Swagger、JWT鉴权、EF Core、仓储模式、统一响应格式、日志、异常中间件一一配齐,熟练的话也要40分钟到1个小时。如果团队里每个人的习惯不一样,有人用Autofac、有人用内置DI,有人喜欢Controller直接写业务、有人坚持Service层,那代码风格更是五花八门,review的时候光是统一格式就得花不少精力。
这就是我做出Chet.WebAPI.Template.Generator的初衷。它不是一个框架,也不是一个运行时组件,而是一个项目生成器——一条命令,把一整套带好了基础架构、规范约束、常用中间件的WebAPI项目骨架给你生成出来。你拿到手之后,直接在这个基础上写业务代码就行。
这篇文章我会把工具的设计思路、使用方式、生成的项目结构、模板定制方法,以及我在开发和日常使用中踩过的坑,完整地写一遍。不管你是刚接触.NET的新手,还是被重复性搭建工作折磨了很久的老手,这篇文章应该都能给你一些可落地的参考。
先说明白这个工具能做什么:
- 基于dotnet CLI工作,跨平台可用,Windows、Linux、macOS都能跑
- 支持生成完整的分层解决方案,Controller层、Service层、Repository层、DTO、实体、扩展方法一应俱全
- 自动集成Swagger,并且按版本分组展示
- 自带了JWT认证的整套配置骨架,你只需要填入密钥和过期时间
- 统一响应格式、全局异常处理中间件、CORS策略、Serilog日志,这些都已经是"开箱即用"的状态
- 支持模板参数化,你可以通过编辑模板来定义自己的项目风格,团队规范可以直接固化进来
接下来我从实际使用的角度,把每一步拆开讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装与第一条生成命令:从NuGet到解决方案落地
2.1 安装方式与前置条件
这个生成器以.NET Tool的形式分发,安装命令很简单:
bash复制dotnet tool install -g Chet.WebAPI.Template.Generator
安装之前确保本机已经装了.NET SDK(6.0或更高版本都可以)。你可以在终端里用下面的命令确认:
bash复制dotnet --version
如果显示的是类似8.0.100这样的版本号,说明SDK没问题。
装好之后,命令行工具名是chet-webapi。你可以直接输入这个命令查看帮助信息:
bash复制chet-webapi --help
看到Usage信息,说明安装成功了。
提示:如果你本机同时装了多个.NET SDK版本,建议在
global.json里固定一个版本,避免生成的模板引用到不兼容的目标框架。我一开始没注意这个,结果在不同机器上生成的csproj目标框架不一致,导致了后面不少麻烦。
2.2 生成项目的完整步骤
在你想创建项目的目录下,执行:
bash复制chet-webapi generate -n MyCompany.Orders.Api -o ./OrdersService
参数说明:
-n指定项目的名称,建议用公司前缀+业务模块的命名方式,比如Acme.Inventory.Api-o指定输出目录,如果不填,默认生成到当前目录下
执行之后,命令行会进入交互式问答,问你几个关键的配置选项:
- 目标框架:net8.0还是net6.0?这里建议直接用net8.0,除非你有特殊兼容需求。
- 是否启用JWT认证:输入y或n。如果选y,会自动生成JWT相关的配置类和appsettings占位节点。
- 数据库选型:EF Core + SQLServer、EF Core + PostgreSQL、还是Dapper?这个选择会影响生成的Repository层和数据访问代码。
- 是否启用API版本控制:建议启用,尤其是接口要对外提供服务的时候。
回答完这几个问题,工具会开始生成文件。你会在目标目录下看到这样的结构:
code复制OrdersService/
├── MyCompany.Orders.Api.sln
├── src/
│ ├── MyCompany.Orders.Api/
│ │ ├── Controllers/
│ │ ├── Middlewares/
│ │ ├── Extensions/
│ │ ├── appsettings.json
│ │ └── Program.cs
│ ├── MyCompany.Orders.Application/
│ │ ├── Services/
│ │ ├── DTOs/
│ │ └── Interfaces/
│ └── MyCompany.Orders.Domain/
│ ├── Entities/
│ ├── Enums/
│ └── Interfaces/
├
