Pular para o conteúdo
Skillpedia
APIs e servidores (backend)280 mil · #50

dotnet-patterns

Faz seu agente aplicar padrões e melhores práticas em C# e .NET. É útil para escrever ou revisar código, garantindo aplicações robustas e fáceis de manter.

O que ela faz

Este agente ajuda você a escrever código em C# e .NET seguindo as melhores práticas. Ele sugere formas de organizar seu código para que ele seja mais fácil de entender, manter e mais rápido.

Quando usar

  • ✓Ao escrever código novo em C#.
  • ✓Ao revisar código escrito por outra pessoa.
  • ✓Ao planejar a estrutura de um novo serviço.

Exemplo do que pedir para a IA

“Como posso garantir que meu código C# seja fácil de manter?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/dotnet-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/dotnet-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele analisa seu código C# e sugere melhorias baseadas em padrões estabelecidos. Ele foca em clareza, organização e eficiência.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill dotnet-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/dotnet-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Desenvolvimento .NET

Padrões idiomáticos de C# e .NET para construir aplicações robustas, performáticas e fáceis de manter.

Quando Ativar

  • Escrevendo código C# novo
  • Revisando código C#
  • Refatorando aplicações .NET existentes
  • Projetando arquiteturas de serviços com ASP.NET Core

Princípios Fundamentais

1. Prefira Imutabilidade

Use records e propriedades init-only para modelos de dados. Mutabilidade deve ser uma escolha explícita e justificada.

// 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; }
}

2. Explícito Sobre Implícito

Seja claro sobre nulidade, modificadores de acesso e intenção.

// 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);
    }
}

3. Dependa de Abstrações

Use interfaces para limites de serviço. Registre via contêiner de DI.

// 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>();

Padrões Async/Await

Uso Correto de Async

// 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);
}

Operações Async Paralelas

// 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);
}

Padrão Options

Vincule seções de configuração a objetos fortemente tipados.

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
public class EmailService(IOptions<SmtpOptions> options)
{
    private readonly SmtpOptions _smtp = options.Value;
}

Padrão Result

Retorne sucesso/falha explícitos em vez de lançar exceções para falhas esperadas.

public sealed record Result<T>
{
    public bool IsSuccess { get; }
    public T? Value { get; }
    public string? Error { get; }

    private Result(T value) { IsSuccess = true; Value = value; }
    private Result(string error) { IsSuccess = false; Error = error; }


…
Perguntas frequentes

O que são 'padrões' em programação?

Padrões são soluções testadas e comprovadas para problemas comuns no desenvolvimento de software. Eles ajudam a escrever código mais organizado e eficiente.

O que é 'injetor de dependência' (DI)?

É uma forma de organizar o código onde as 'dependências' (outras partes do código que um componente precisa para funcionar) são fornecidas externamente, em vez de o componente criá-las ele mesmo.

O que significa 'imutabilidade'?

Significa que um dado, uma vez criado, não pode ser alterado. Isso ajuda a evitar erros e torna o código mais previsível.

Detalhes

Descrição original do autor

Idiomatic C# and .NET patterns, conventions, dependency injection, async/await, and best practices for building robust, maintainable .NET applications. Use when writing or reviewing C# / .NET code — DI, async, or general conventions.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#50
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas