图表
概览
架构
依赖关系
项目依赖
代码流程
仓储与工作单元
技术栈
- ASP.NET Core 8.0 (基于 .NET 8.0)
- ASP.NET WebApi Core
- ASP.NET Identity Core
- Entity Framework Core
- .NET Core 原生依赖注入
- AutoMapper
- FluentValidation
- MediatR
- Swagger UI
- MSSQL
- xUnit
- Moq
- FluentAssertions
- Polly
- Refit
- DbUp
- NPOI
- Quartz
- StyleCop
设计模式
- 领域驱动设计
- 领域事件
- 领域通知
- 命令查询职责分离 (CQRS)
- 事件溯源
- 工作单元
- 仓储模式 & 通用仓储
- 控制反转 / 依赖注入
- ORM
- 中介者模式
- 规约模式
- 选项模式
预配置
-
配置用户密钥:
- 在
DDD.Services.Api.csproj
中找到UserSecretsId
(可更改为任意 GUID/UUID) - Windows:
C:\Users\[用户名]\AppData\Roaming\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
- Linux / macOS:
~/.microsoft/usersecrets/<user_secrets_id>/secrets.json
- 在
-
Windows 的
secrets.json
:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=DDD;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
-
LocalDB 是 SQL Server Express Edition 的打包机制,仅适用于 Windows,Linux / macOS 请使用 Microsoft SQL Server 或 Azure SQL Edge
-
Linux / macOS 的
secrets.json
:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=<ip地址>,1433;Initial Catalog=aspnetcore-ddd;User ID=SA;pwd=<你的新强密码>;Integrated Security=False;ConnectRetryCount=0;MultipleActiveResultSets=True"
}
}
如何运行
- Visual Studio:
选择配置文件 > 运行 (F5)
- VSCode:
选择配置 > 运行 (F5)
- 终端:
dotnet build Src/DDD.Services.Api/DDD.Services.Api.csproj
dotnet run --project Src/DDD.Services.Api/DDD.Services.Api.csproj --launch-profile Dev
dotnet watch --project Src/DDD.Services.Api/DDD.Services.Api.csproj run
测试
- 终端:
dotnet test
Docker
docker build -t aspnetcore-docker-image .
docker run -it --rm -p 3000:80 --name aspnetcore-docker-container aspnetcore-docker-image
docker run -d -p 3000:80 --name aspnetcore-docker-container aspnetcore-docker-image
docker compose up -d
docker compose ps
docker compose stop
Podman
podman build -t aspnetcore-docker-image .
podman run -it --rm -p 3000:80 --name aspnetcore-docker-container aspnetcore-docker-image
podman run -d -p 3000:80 --name aspnetcore-docker-container aspnetcore-docker-image
podman-compose up -d
podman-compose ps
podman-compose stop
Swagger(仅限开发环境)
健康检查(仅限预发布和生产环境)
待办事项
- 使用多环境
- 事务(工作单元)
- 验证(FluentValidation)
- 响应包装器
- 异步/等待
- REST
- JWT
- 映射(AutoMapper)
- API规范,API定义(Swagger)
- ORM {Entity Framework Core}
- 中间件
- CORS
- 分页
- 排序
- 错误处理,全局异常
- 健康检查
- 邮件
- Http
- 数据库审计:创建时间/更新时间 创建者/更新者
- 软删除
- 通用:常量,辅助函数
- Docker,Docker Compose,Github容器注册表
- EF:影子属性
- 事件
- 单元测试
- 集成测试
- 使用Scoped而非Transient
- 在适当的类中使用
abstract
关键字 - 使用
IQueryable
,IEnumerable
,IList
接口 - 为类库使用NetStandard 2.1
- 哈希
-
分析级别:自动查找潜在错误(.NET 5或更高版本默认启用) - 迁移(DbUp)
- 用户机密
- API版本控制
- 带Swagger的API版本控制
- Kubernetes
- AKS
- 热重载
- SignalR
- 通知
- Webhook
- 任务调度与队列:Quartz
- Quartz:即发即弃
- NPOI
- REST客户端
- StyleCopAnalyzers(使用默认规则集并禁用9条规则:SA0001,SA1200,SA1201,SA1309,SA1400,SA1512,SA1600,SA1601,SA1633)
- RoslynAnalyzers(.NET 5或更高版本默认启用)
- Secret Manager
- OmniSharp Roslyn
- sonar-dotnet
- docfx
- Autofac
- Bogus
- 脚手架
- 数据种子
- 日志记录
- OAuth2,OIDC(OpenId Connect)
- 搜索
- Kafka,RabbitMQ
- 微服务,API网关(Ocelot,yarp)
- 多租户
- 主键改为整数
- 文件存储:上传/下载
- 全球化与本地化
- 缓存
- Kestrel
- 会话与Cookie
- 加密
- EF:无跟踪查询
- Dapper,Dapper Contrib(可选)
- RepoDB
- 批量插入,批量更新,IRepository的异步方法
参考资料
- https://github.com/EduardoPires/EquinoxProject
- https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles
- https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims
- https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies
- https://docs.microsoft.com/en-us/aspnet/core/security/authorization/limitingidentitybyscheme
- https://www.red-gate.com/simple-talk/dotnet/c-programming/policy-based-authorization-in-asp-net-core-a-deep-dive/
- https://docs.microsoft.com/en-us/archive/msdn-magazine/2017/october/cutting-edge-policy-based-authorization-in-asp-net-core
- https://dev.azure.com/Techhowdy/_git/NG_Core_AuthRTDB
- https://github.com/Elfocrash/Youtube.AspNetCoreTutorial
- https://www.meziantou.net/entity-framework-core-soft-delete-using-query-filters.htm
- https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments
- https://michael-mckenna.com/multi-tenant-asp-dot-net-core-application-tenant-resolution
- https://stackify.com/writing-multitenant-asp-net-core-applications/
- https://github.com/DanielRBowen/SimpleMultiTenant
- https://deviq.com/specification-pattern/
- https://devblogs.microsoft.com/dotnet/automatically-find-latent-bugs-in-your-code-with-net-5/
- https://xunit.github.io/docs/why-no-netstandard