Dotnet 后端 Patter

设计与多媒体 社区
解读按原文结构重写,命令、链接、术语均保留;右侧可核对作者原始 SKILL.md

原文结构

  • Core Concepts:原文以此为独立章节。
  • 1. Project Structure (Clean Architecture):原文以此为独立章节。
  • 2. Dependency Injection Patterns:原文以此为独立章节。

适用与边界

  • When to Use This Skill:Developing new .NET Web APIs or MCP servers Reviewing C code for quality and performance Designing service architectures with dependency injection
  • 5. Result Pattern (Avoiding Exceptions for Flow Control):原文以此为独立章节。
  • Common Pitfalls:N+1 Queries: Use .Include() or explicit joins Memory Leaks: Dispose IDisposable resources, use using Deadlocks: Don't mix sync and async, use ConfigureAwait(false) in libraries

原文中的明确线索

  • 要点:「Use async/await」、「Inject dependencies」、「Use IOptions<T>」、「Return Result types」、「Use CancellationToken」、「Prefer Dapper」、「Use EF Core」、「Cache aggressively」
  • 文件与命令.Result.Wait()AsNoTracking()new HttpClient().Include()using

流狐整理:以上内容来自当前 SKILL.md 的章节与原词;未补写作者没有声明的工具、兼容性或能力。

流狐档案 作者与许可取自来源;运行、权限和网络为流狐检测或估算
流狐分类
设计与多媒体
作者声明 Agent
未找到明确声明;不据此推断已兼容或已测试
静态检查
88 / 100 · 启发式扫描,不代表运行安全
作者 / 版本 / 许可
@wshobson · 未声明 license
流狐 Token 估算
较高消耗
流狐接入估算
需简单配置
是否需要外部 API Key
未发现要求
检测到的系统要求
未声明
底层运行要求
未声明
检测到的文件与系统行为
  • 只读
  • 允许写入 / 修改
  • Shell 执行
检测到的网络行为
允许外网请求
安装命令数
无(仅作为资料)

档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。

需要注意: 未限定 allowed-tools,默认拥有全部工具权限。

输出预览 dotnet-backend-patterns.preview
# 5. Result Pattern (Avoiding Exceptions for Flow Control)

// Generic Result type
public class Result<T>
{
    public bool IsSuccess { get; }
    public T? Value { get; }
    public string? Error { get; }
    public string? ErrorCode { get; }

    private Result(bool isSuccess, T? value, string? error, string? errorCode)
    {
        IsSuccess = isSuccess;
        Value = value;
        Error = error;
        ErrorCode = errorCode;
    }

    public static Result<T> Success(T value) => new(true, value, null, null);
    public static Result<T> Failure(string error, string? code = null) => new(false, default, error, code);

    public Result<TNew> Map<TNew>(Func<T, TNew> mapper) =>
        IsSuccess ? Result<TNew>.Success(mapper(Value!)) : Result<TNew>.Failure(Error!, ErrorCode);

    public async Task<Result<TNew>> MapAsync<TNew>(Func<T, Task<TNew>> mapper) =>
        IsSuccess ? Result<TNew>.Success(await mapper(Value!)) : Result<TNew>.Failure(Error!, ErrorCode);
}

// Usage in service
public async Task<Result<Order>> CreateOrderAsync(CreateOrderRequest request, CancellationToken ct)
{
    // Validation
    var validation = await _validator.ValidateAsync(request, ct);
    if (!validation.IsValid)
        return Result<Order>.Failure(
            validation.Errors.First().ErrorMessage,
            "VALIDATION_ERROR");

    // Business rule check
    var stock = await _stockService.CheckAsync(request.ProductId, request.Quantity, ct);
    if (!stock.IsAvailable)
        return Result<Order>.Failure(
            $"Insufficient stock: {stock.Available} available, {request.Quantity} requested",
            "INSUFFICIENT_STOCK");

    // Create order
    var order = await _repository.CreateAsync(request.ToEntity(), ct);

    return Result<Order>.Success(order);
}

// Usage in controller/endpoint
app.MapPost("/orders", async (
    CreateOrderRequest request,
    IOrderService orderService,
    CancellationToken ct) =>
{
    var result = await orderService.CreateOrderAsync(request, ct);

    return result.IsSuccess
        ? Results.Created($"/orders/{result.Value!.Id}", result.Value)
        : Results.BadRequest(new { error = result.Error, code = result.ErrorCode });
});

讨论

基于 GitHub Discussions。登录 GitHub 即可参与讨论、点赞、订阅更新。