为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P
TodoList需求简介
首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能,我不会一次性把所有的特性诸如允许用户登陆之类的需求全部写上,只是先列出最基本的功能性需求:
- 我们可以维护一个TodoList。
- TodoList可以包含多个TodoItem。
- 对于TodoList,我们可以设置其名称
- 对于每个TodoItem,我们可以设置其内容,超期时间,是否完成。
- 对于所有实体,可以完成增删改查的操作。
开发工具
.NET 6
.NET 6这个没什么好说的,按照官方说明下载安装好就可以了。
Visual Studio Code
使用Visual Studio Code的原因是其免费,跨平台,功能足够用。虽然在智能补全上不如Visual Studio、Visual Studio for Mac或者Rider强大,但是因为看这篇文章的你可能用不同的系统,不同的工具,所以我还是决定用所有平台都免费并且表现一致的IDE来进行演示,你可以任选一个自己已有的IDE进行开发。
当然为了顺利的使用VScode开发.NET 6 Web API
项目,有一些扩展应用也是必须要安装的,在VSCode的Extension
中搜索并安装以下扩展ID:
-
ms-dotnettools.csharp
- 由OmniSharp
提供的VSCode开发调试C#项目的必选项。 -
ms-azuretools.vscode-docker
-Docker
扩展。
Hoppscotch
大家可能对这个工具名字比较陌生,这是用于对Web API
项目进行本地测试的工具。大家更熟悉Postman
,而这款工具的前身叫做Postwoman
,现在更名为Hoppscotch
,使用Chrome内核的浏览器打开Hoppscotch后可以在地址栏上点击可用扩展标志,选择安装到本地,方便以后使用:
打开以后的界面长这样:
功能非常强大,测试Restful
接口,GraphQL
接口,实时通信接口(WebSocket/SSE/Socket.IO/MQTT
)都可以,而且占用资源比Postman要低很多,颜值又高还免费……简直良心。
Clean Architecture简介
Clean Architecture是大神Robert C. Martin
在自己的博客上发表的一篇关于如何组织应用程序结构和依赖关系来实现更好的独立、解耦的多层项目结构的方式,推荐大家有时间把这篇文章好好看一下。
经过长久的实践和演化,目前我个人觉得最简洁、使用起来最舒服的Clean Architecture结构是这样的:
搭建解决方案结构
# 创建解决方案目录
mkdir TodoList && cd TodoList
# 创建解决方案
dotnet new sln -n TodoList
# 按照clean architecture的项目结构,创建WebApi项目以及classlib项目
dotnet new webapi -f net6.0 -n TodoList.Api -o ./src/TodoList.Api
dotnet new classlib -f net6.0 -n TodoList.Application -o ./src/TodoList.Application
dotnet new classlib -f net6.0 -n TodoList.Domain -o ./src/TodoList.Domain
dotnet new classlib -f net6.0 -n TodoList.Infrastructure -o ./src/TodoList.Infrastructure
# 按照clean architecture的结构和依赖关系,设置项目间的引用
# Application只依赖于Domain
dotnet add src/TodoList.Application/TodoList.Application.csproj reference src/TodoList.Domain/TodoList.Domain.csproj
# Infrastructure只依赖于Application
dotnet add src/TodoList.Infrastructure/TodoList.Infrastructure.csproj reference src/TodoList.Application/TodoList.Application.csproj
# Api依赖于Application和Infrastructure
dotnet add src/TodoList.Api/TodoList.Api.csproj reference src/TodoList.Application/TodoList.Application.csproj
dotnet add src/TodoList.Api/TodoList.Api.csproj reference src/TodoList.Infrastructure/TodoList.Infrastructure.csproj
# 将所有项目添加到sln上
dotnet sln TodoList.sln add src/TodoList.Api/TodoList.Api.csproj
dotnet sln TodoList.sln add src/TodoList.Application/TodoList.Application.csproj
dotnet sln TodoList.sln add src/TodoList.Domain/TodoList.Domain.csproj
dotnet sln TodoList.sln add src/TodoList.Infrastructure/TodoList.Infrastructure.csproj
运行
在终端定位到当前解决方案目录里运行:
$ dotnet restore
Determining projects to restore...
Restored /Users/yu.li1/Projects/asinta/blogs/cnblogs/TodoList/src/TodoList.Application/TodoList.Application.csproj (in 206 ms).
Restored /Users/yu.li1/Projects/asinta/blogs/cnblogs/TodoList/src/TodoList.Infrastructure/TodoList.Infrastructure.csproj (in 206 ms).
Restored /Users/yu.li1/Projects/asinta/blogs/cnblogs/TodoList/src/TodoList.Api/TodoList.Api.csproj (in 306 ms).
1 of 4 projects are up-to-date for restore.
$ dotnet run --project src/TodoList.Api/TodoList.Api.csproj
Building...
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:7039
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5050
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: /Users/yu.li1/Projects/asinta/blogs/cnblogs/TodoList/src/TodoList.Api/
使用Hoppscotch
使用WebAPI项目自带的WeatherForecast
接口查看项目是否运行成功:
项目结构到这里就搭建完成了,我们可以删除Api项目中的示例WeatherForecast
相关的文件,以及三个类库项目中的Class1.cs
文件。最终的项目结构长这样:
我们在后续的文章中会逐渐向其中加入更多的代码。
总结
这篇文章从需求开始,介绍了本系列中使用的工具,代码结构,并将项目初始化结束,我还没有解释每个项目文件的含义,但其实类似的内容已经有很多人写过了,可以参考下其他人的文章。
系列导航
- 使用.NET 6开发TodoList应用(1)——系列背景
- 使用.NET 6开发TodoList应用(2)——项目结构搭建
- 使用.NET 6开发TodoList应用(3)——引入第三方日志
- 使用.NET 6开发TodoList应用(4)——引入数据存储
- 使用.NET 6开发TodoList应用(5.0)——领域实体创建和配置
- 使用.NET 6开发TodoList应用(5.1)——实现CQRS模式
- 使用.NET 6开发TodoList应用(5.2)——实现AutoMapper
- 使用.NET 6开发TodoList应用(6)——实现POST请求
- 使用.NET 6开发TodoList应用(7)——实现GET请求
- 使用.NET 6开发TodoList应用(8)——实现全局异常处理
- 使用.NET 6开发TodoList应用(9)——实现PUT请求
- 使用.NET 6开发TodoList应用(10)——实现PATCH请求
- 使用.NET 6开发TodoList应用(11)——HTTP请求幂等性的考虑
- 使用.NET 6开发TodoList应用(12)——实现接口请求验证
- 使用.NET 6开发TodoList应用(13)——实现ActionFilter
- 使用.NET 6开发TodoList应用(14)——实现查询分页
- 使用.NET 6开发TodoList应用(15)——实现查询过滤
- 使用.NET 6开发TodoList应用(16)——实现查询搜索
- 使用.NET 6开发TodoList应用(17)——实现查询排序
- 使用.NET 6开发TodoList应用(18)——实现数据塑形
- 使用.NET 6开发TodoList应用(19)——实现HATEAOS支持
- 使用.NET 6开发TodoList应用(20)——处理OPTION和HEAD请求
- 使用.NET 6开发TodoList应用(21)——实现Root Document
- 使用.NET 6开发TodoList应用(22)——实现API版本控制
- 使用.NET 6开发TodoList应用(23)——实现缓存
- 使用.NET 6开发TodoList应用(24)——实现请求限流和阈值控制
- 使用.NET 6开发TodoList应用(25)——实现基于JWT的Identity功能
- 使用.NET 6开发TodoList应用(26)——实现RefreshToken
- 使用.NET 6开发TodoList应用(27)——实现Configuration和Option的强类型绑定
- 使用.NET 6开发TodoList应用(28)——实现API的Swagger文档化
- 使用.NET 6开发TodoList应用(29)——实现应用程序健康检查
- 使用.NET 6开发TodoList应用(30)——实现本地化功能
- 使用.NET 6开发TodoList应用(31)——实现Docker打包和部署
- 使用.NET 6开发TodoList应用(32)——实现基于Github Actions和ACI的CI/CD