提供地道的 C# 与 .NET 架构模式、异步编程和依赖注入实践建议
该技能材料显示其本质是面向 C#/.NET 开发的提示词/文档型技能,不要求密钥,也未声明任何远程连接、本地执行或数据读写能力。结合开源 GitHub 来源与较高社区采用度,整体风险较低。
材料明确标注无需密钥或环境变量;作为提示词/文档型技能,未见凭证收集、存储或滥用路径。
未声明任何远程端点或网络连接能力,材料内容也仅为开发模式与示例代码,未见将用户数据外发的迹象。
系统检查项为 prompt-only,README 也呈现为静态开发指导内容;未见本机起进程、执行脚本或调用系统能力的描述。
未声明文件系统、数据库、剪贴板或其他本地/远程数据访问权限;从材料看其作用仅是提供编码规范建议。
来源为 GitHub 开源仓库,具备可审计性,且社区采用度很高(约21万 star),这些都是明显的正面信号。需注意许可证未声明、维护状态未知,但在未见其他红旗时不足以抬升为更高风险。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "dotnet-patterns" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/skills/dotnet-patterns/SKILL.md 2. 保存为 ~/.claude/skills/dotnet-patterns/SKILL.md 3. 装好后重载技能,告诉我可以用了
请为一个 ASP.NET Core Web API 设计清晰的分层架构,包含 Controller、Application、Domain、Infrastructure 四层,说明每层职责、依赖方向,并给出依赖注入注册建议与示例代码。
输出分层架构说明、项目组织建议,以及符合 .NET 习惯的 DI 配置与示例代码。
下面这段 C# 异步代码容易造成阻塞和异常处理不一致,请帮我重构为符合 .NET 最佳实践的写法,并解释什么时候使用 Task、ValueTask、CancellationToken 和 ConfigureAwait。代码如下: [在此粘贴代码]
输出重构后的异步代码、问题分析,以及 async/await 相关最佳实践说明。
请从命名规范、异常处理、日志、配置管理、依赖注入、测试可维护性几个方面,审查这个 .NET 项目的代码风格与架构习惯,并给出可执行的改进清单。 [在此粘贴项目片段或目录结构]
输出针对 .NET 项目规范的审查意见、风险点和按优先级排序的改进建议。
Idiomatic C# and .NET patterns for building robust, performant, and maintainable applications.
Use records and init-only properties for data models. Mutability should be an explicit, justified choice.
// Good: Immutable value object
public sealed record Money(decimal Amount, string Currency);
// Good: Immutable DTO with init setters
public sealed class CreateOrderRequest
{
public required string CustomerId { get; init; }
public required IReadOnlyList<OrderItem> Items { get; init; }
}
// Bad: Mutable model with public setters
public class Order
{
public string CustomerId { get; set; }
public List<OrderItem> Items { get; set; }
}
Be clear about nullability, access modifiers, and intent.
// Good: Explicit access modifiers and nullability
public sealed class UserService
{
private readonly IUserRepository _repository;
private readonly ILogger<UserService> _logger;
public UserService(IUserRepository repository, ILogger<UserService> logger)
{
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public async Task<User?> FindByIdAsync(Guid id, CancellationToken cancellationToken)
{
return await _repository.FindByIdAsync(id, cancellationToken);
}
}
Use interfaces for service boundaries. Register via DI container.
// Good: Interface-based dependency
public interface IOrderRepository
{
Task<Order?> FindByIdAsync(Guid id, CancellationToken cancellationToken);
Task<IReadOnlyList<Order>> FindByCustomerAsync(string customerId, CancellationToken cancellationToken);
Task AddAsync(Order order, CancellationToken cancellationToken);
}
// Registration
builder.Services.AddScoped<IOrderRepository, SqlOrderRepository>();
// Good: Async all the way, with CancellationToken
public async Task<OrderSummary> GetOrderSummaryAsync(
Guid orderId,
CancellationToken cancellationToken)
{
var order = await _repository.FindByIdAsync(orderId, cancellationToken)
?? throw new NotFoundException($"Order {orderId} not found");
var customer = await _customerService.GetAsync(order.CustomerId, cancellationToken);
return new OrderSummary(order, customer);
}
// Bad: Blocking on async
public OrderSummary GetOrderSummary(Guid orderId)
{
var order = _repository.FindByIdAsync(orderId, CancellationToken.None).Result; // Deadlock risk
return new OrderSummary(order);
}
// Good: Concurrent independent operations
public async Task<DashboardData> LoadDashboardAsync(CancellationToken cancellationToken)
{
var ordersTask = _orderService.GetRecentAsync(cancellationToken);
var metricsTask = _metricsService.GetCurrentAsync(cancellationToken);
var alertsTask = _alertService.GetActiveAsync(cancellationToken);
await Task.WhenAll(ordersTask, metricsTask, alertsTask);
return new DashboardData(
Orders: await ordersTask,
Metrics: await metricsTask,
Alerts: await alertsTask);
}
Bind configuration sections to strongly-typed objects.
public sealed class SmtpOptions
{
public const string SectionName = "Smtp";
public required string Host { get; init; }
public required int Port { get; init; }
public required string Username { get; init; }
public bool UseSsl { get; init; } = true;
}
// Registration
builder.Services.Configure<SmtpOptions>(
builder.Configuration.GetSection(SmtpOptions.SectionName));
// Usage via injection
…
为 Quarkus 项目执行发布前验证闭环,涵盖构建、测试、扫描与差异审查。
帮助你掌握 Pythonic 写法、类型标注与规范实践,写出更稳健易维护的 Python 代码。