dotnet-backend-patterns
Faz seu agente dominar padrões de desenvolvimento backend em C#/.NET. É útil para criar APIs robustas, gerenciar dados e construir aplicações empresariais eficientes.
O que ela faz
Esta habilidade ajuda você a entender e aplicar as melhores práticas de programação para criar sistemas robustos em .NET (a linguagem C#). Ela cobre desde a organização do código até como lidar com tarefas assíncronas e configurar seu aplicativo.
Quando usar
- ✓Ao iniciar um novo projeto backend em .NET.
- ✓Ao revisar o código C# para garantir qualidade.
- ✓Ao projetar a estrutura de APIs e serviços.
Exemplo do que pedir para a IA
“Como posso organizar meu projeto .NET seguindo a arquitetura limpa?”
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
Mensagem pronta para colar
Como funciona
A habilidade explica conceitos como a estrutura de pastas (Clean Architecture), como injetar dependências (Dependency Injection) para tornar o código mais flexível e como usar `async/await` para lidar com operações que levam tempo sem travar o sistema.
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 wshobson/agents --skill dotnet-backend-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/wshobson/agents/main/plugins/dotnet-contribution/skills/dotnet-backend-patterns/SKILL.md -o SKILL.mdConteú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 de Backend .NET
Domine padrões C#/.NET para construir APIs de produção, servidores MCP e backends corporativos com as melhores práticas modernas (2024/2025).
Quando Usar Esta Habilidade
- Desenvolvendo novas APIs Web .NET ou servidores MCP
- Revisando código C# para qualidade e desempenho
- Projetando arquiteturas de serviço com injeção de dependência
- Implementando estratégias de cache com Redis
- Escrevendo testes unitários e de integração
- Otimizando o acesso ao banco de dados com EF Core ou Dapper
- Configurando aplicações com o padrão IOptions
- Tratando erros e implementando padrões de resiliência
Conceitos Principais
1. Estrutura do Projeto (Arquitetura Limpa)
src/
├── Domain/ # Core business logic (no dependencies)
│ ├── Entities/
│ ├── Interfaces/
│ ├── Exceptions/
│ └── ValueObjects/
├── Application/ # Use cases, DTOs, validation
│ ├── Services/
│ ├── DTOs/
│ ├── Validators/
│ └── Interfaces/
├── Infrastructure/ # External implementations
│ ├── Data/ # EF Core, Dapper repositories
│ ├── Caching/ # Redis, Memory cache
│ ├── External/ # HTTP clients, third-party APIs
│ └── DependencyInjection/ # Service registration
└── Api/ # Entry point
├── Controllers/ # Or MinimalAPI endpoints
├── Middleware/
├── Filters/
└── Program.cs
2. Padrões de Injeção de Dependência
// Service registration by lifetime
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddApplicationServices(
this IServiceCollection services,
IConfiguration configuration)
{
// Scoped: One instance per HTTP request
services.AddScoped<IProductService, ProductService>();
services.AddScoped<IOrderService, OrderService>();
// Singleton: One instance for app lifetime
services.AddSingleton<ICacheService, RedisCacheService>();
services.AddSingleton<IConnectionMultiplexer>(_ =>
ConnectionMultiplexer.Connect(configuration["Redis:Connection"]!));
// Transient: New instance every time
services.AddTransient<IValidator<CreateOrderRequest>, CreateOrderValidator>();
// Options pattern for configuration
services.Configure<CatalogOptions>(configuration.GetSection("Catalog"));
services.Configure<RedisOptions>(configuration.GetSection("Redis"));
// Factory pattern for conditional creation
services.AddScoped<IPriceCalculator>(sp =>
{
var options = sp.GetRequiredService<IOptions<PricingOptions>>().Value;
return options.UseNewEngine
? sp.GetRequiredService<NewPriceCalculator>()
: sp.GetRequiredService<LegacyPriceCalculator>();
});
// Keyed services (.NET 8+)
services.AddKeyedScoped<IPaymentProcessor, StripeProcessor>("stripe");
services.AddKeyedScoped<IPaymentProcessor, PayPalProcessor>("paypal");
return services;
}
}
// Usage with keyed services
public class CheckoutService
{
public CheckoutService(
[FromKeyedServices("stripe")] IPaymentProcessor stripeProcessor)
{
_processor = stripeProcessor;
}
}
3. Padrões Async/Await
// ✅ CORRETO: Async em toda a cadeia
public async Task<Product> GetProductAsync(string id, CancellationToken ct = default)
{
return await _repository.GetByIdAsync(id, ct);
}
// ✅ CORRETO: Execução paralela com WhenAll
public async Task<(Stock, Price)> GetStockAndPriceAsync(
string productId,
CancellationToken ct = default)
{
var stockTask = _stockService.GetAsync(productId, ct);
var priceTask = _priceService.GetAsync(productId, ct);
await Task.WhenAll(stockTask, priceTask);
return (await stockTask, await priceTask);
}
// ✅ CORRETO: ConfigureAwait em bibliotecas
public async Task<T> LibraryMethodAsync<T>(CancellationToken ct = default)
{
var result = await _httpClient.GetAsync(url, ct).ConfigureAwait(false);
return await result.Content.ReadFromJsonAsync<T>(ct).ConfigureAwait(false);
}
// ✅ CORRETO: ValueTask para caminhos quentes com cache
public ValueTask<Product?> GetCachedProductAsync(string id)
{
if (_cache.TryGetValue(id, out Product? product))
return ValueTask.FromResult(product);
return new ValueTask<Product?>(GetFromDatabaseAsync(id));
}
// ❌ ERRADO: Bloqueando em async (risco de deadlock)
…
Perguntas frequentes
O que é 'Dependency Injection'?
É uma técnica onde as dependências (outras partes do código que um componente precisa) são fornecidas de fora, em vez de serem criadas dentro do próprio componente. Isso torna o código mais fácil de testar e modificar.
Por que usar 'async/await'?
Para que seu programa possa fazer outras coisas enquanto espera por operações demoradas, como acessar um banco de dados ou chamar um serviço externo. Isso melhora a responsividade e o desempenho.
O que é 'Clean Architecture'?
É uma forma de organizar o código em camadas, separando as responsabilidades. A ideia é manter a lógica principal do negócio isolada de detalhes externos como bancos de dados ou interfaces de usuário.
Detalhes
Descrição original do autor
Master C#/.NET backend development patterns for building robust APIs, MCP servers, and enterprise applications. Covers async/await, dependency injection, Entity Framework Core, Dapper, configuration, caching, and testing with xUnit. Use when developing .NET backends, reviewing C# code, or designing API architectures.
repo: wshobson/agents
Popularidade
- Estrelas no GitHub
- 41 mil
- Posição no ranking
- #4860
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
screen-reader-testing
Faz seu agente testar sites usando leitores de tela para garantir que sejam acessíveis.
wshobson/agents
wcag-audit-patterns
Ajuda seu agente a auditar sites para acessibilidade e corrigir problemas de acordo com as diretrizes WCAG.
wshobson/agents
multi-reviewer-patterns
Faz seu agente coordenar revisões de código paralelas, deduplicando achados e consolidando relatórios.
wshobson/agents
parallel-debugging
Permite ao agente depurar problemas complexos com investigações paralelas e análise de causa raiz.
wshobson/agents
Skills parecidas
api-connector-builder
Faz seu agente construir novas conexões com APIs seguindo o padrão já existente. Use quando precisar adicionar mais uma integração sem criar um novo jeito de fazer.
affaan-m/ECC
api-design
Ajuda seu agente a projetar APIs REST seguindo as melhores práticas. É útil para definir como as APIs se comunicam, como os erros são mostrados e como organizar os dados.
affaan-m/ECC
backend-patterns
Ajuda seu agente com padrões de arquitetura do lado do servidor e otimização de banco de dados. É útil para construir ou revisar o código que roda no servidor.
affaan-m/ECC