用途
dotnet-patterns 是一份 C# 与 .NET 的惯用模式(idiomatic patterns)与最佳实践参考,目标是帮助构建稳健、高性能且可维护的 .NET 应用。资料说明可在以下情况启用:编写新的 C# 代码、审查 C# 代码、重构既有 .NET 应用、使用 ASP.NET Core 设计服务架构。
主要能力
核心原则
- 优先不可变性:数据模型使用 records 与 init-only 属性,可变性应是显式且有理由的选择。示例中给出不可变值对象
public sealed record Money(decimal Amount, string Currency);,以及使用 init 设置器的不可变 DTOCreateOrderRequest(含required string CustomerId、required IReadOnlyList<OrderItem> Items);反面示例是带公共 setter 的可变模型。 - 显式优于隐式:明确可空性、访问修饰符与意图。示例
UserService使用私有只读字段、构造函数注入并在构造时对依赖做空值检查,方法签名显式标注可空返回Task<User?>。 - 依赖抽象:用接口定义服务边界,并通过 DI 容器注册,例如定义
IOrderRepository,注册builder.Services.AddScoped<IOrderRepository, SqlOrderRepository>();。
异步与配置模式
- Async/Await:要求“全程异步”并传递
CancellationToken;反面示例指出对异步结果使用.Result存在死锁风险。 - 并行异步:对相互独立的操作使用
Task.WhenAll,示例通过ordersTask、metricsTask、alertsTask并发加载仪表盘数据。 - Options 模式:将配置节绑定到强类型对象,示例
SmtpOptions定义SectionName常量与 required 属性,注册使用builder.Services.Configure<SmtpOptions>(builder.Configuration.GetSection(SmtpOptions.SectionName));,并通过IOptions<SmtpOptions>注入使用。 - Result 模式:对预期内的失败返回显式的成功/失败结果而非抛出异常,示例给出泛型
Result<T>的构造与Success/Failure静态方法,以及PlaceOrderAsync中的使用方式。
数据访问、管线与 API
- 仓储模式配合 EF Core:示例
SqlOrderRepository使用Include、AsNoTracking、FirstOrDefaultAsync、ToListAsync等方法,并传入CancellationToken。 - 中间件与管线:示例
RequestTimingMiddleware通过RequestDelegate与ILogger记录请求耗时与状态码。 - Minimal API:用路由分组组织端点,示例
app.MapGroup("/api/orders").RequireAuthorization().WithTags("Orders");,并展示MapGet、MapPost配合TypedResults.Ok/NotFound/Created/BadRequest的写法。 - 守卫子句:提前校验与提前返回,使用
ArgumentNullException.ThrowIfNull、针对金额与货币的参数校验,避免深层嵌套。
反模式对照
资料以表格形式列出常见反模式与修复方式:async void 方法应返回 Task(事件处理器除外);.Result 或 .Wait() 应改用 await;catch (Exception) { } 应处理或带上下文重抛;在构造函数中 new Service() 应改用构造函数注入;公共字段应改为带合适访问器的属性;业务逻辑中的 dynamic 应用泛型或显式类型;可变静态状态应改用 DI 作用域或 ConcurrentDictionary;循环中的 string.Format 应改用 StringBuilder 或内插字符串处理器。
使用方式
资料提供的是模式说明与代码示例,按“何时激活”的场景将其作为编码与评审参考即可。具体安装命令、集成步骤暂未提供。
适用场景
适用于编写、审查和重构 C#/.NET 代码,以及在 ASP.NET Core 中设计服务架构与 API 端点,也可作为团队代码规范的对照清单。
限制
资料未说明其运行环境、版本兼容范围、授权方式、收费情况或与其他工具的集成方式,这些内容暂未提供。