Dotnet backend patterns
Skill tranhieutt/software_development_department/.claude/skills/dotnet-backend-patterns
Software Development Department
npx -y skills add tranhieutt/software_development_department --skill dotnet-backend-patternsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Provides .NET and ASP.NET Core patterns for REST APIs, Entity Framework, dependency injection, and middleware. Use when working with C# files (*.cs, *.csproj) or when the user mentions .NET, ASP.NET Core, C#, or Entity Framework.
SKILL.md
3.6 KB, 686 tokens by cl100k_base, as published. Nobody here has run it
.NET Backend Development Patterns
C#/.NET patterns for production-grade APIs, MCP servers, and enterprise backends.
API Structure (Minimal API + Controllers)
```csharp // Program.cs - Minimal API var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<AppDbContext>(o => o.UseNpgsql(connStr)); builder.Services.AddScoped<IOrderService, OrderService>();
var app = builder.Build(); app.MapGet("/orders/{id}", async (int id, IOrderService svc) => await svc.GetByIdAsync(id) is { } order ? Results.Ok(order) : Results.NotFound()); ```
Dependency Injection Patterns
```csharp // Register services builder.Services.AddScoped<IPaymentService, StripePaymentService>(); builder.Services.AddSingleton<ICacheService, RedisCacheService>(); builder.Services.AddHttpClient<IApiClient, ExternalApiClient>(client => { client.BaseAddress = new Uri("https://api.external.com"); }); ```
Lifetime guide: Singleton (stateless/cache), Scoped (per-request), Transient (stateless utility).
Entity Framework Core
```csharp // DbContext with conventions public class AppDbContext : DbContext { public DbSet<Order> Orders => Set<Order>(); protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<Order>().HasIndex(o => o.UserId); builder.Entity<Order>().Property(o => o.Total).HasPrecision(18, 2); } } ```
Performance tips:
- Use
.AsNoTracking()for read-only queries - Avoid N+1 with
.Include()or projection - Use compiled queries for hot paths
Middleware Pipeline
```csharp app.UseMiddleware<RequestLoggingMiddleware>(); app.UseAuthentication(); app.UseAuthorization(); app.UseRateLimiter(); app.MapControllers(); ```
Error Handling
```csharp // Global exception handler app.UseExceptionHandler(err => err.Run(async context => { var exception = context.Features.Get<IExceptionHandlerFeature>()?.Error; var (status, message) = exception switch { NotFoundException => (404, exception.Message), UnauthorizedAccessException => (403, "Forbidden"), _ => (500, "Internal server error") }; context.Response.StatusCode = status; await context.Response.WriteAsJsonAsync(new { error = message }); })); ```
Configuration (IOptions pattern)
```csharp builder.Services.Configure<StripeSettings>( builder.Configuration.GetSection("Stripe"));
// Usage public class PaymentService(IOptions<StripeSettings> opts) { private readonly string _key = opts.Value.SecretKey; } ```
Testing
```csharp // Integration test with WebApplicationFactory public class OrderApiTests : IClassFixture<WebApplicationFactory<Program>> { private readonly HttpClient _client; [Fact] public async Task GetOrder_ReturnsOk() { var response = await _client.GetAsync("/orders/1"); response.StatusCode.Should().Be(HttpStatusCode.OK); } } ```
Related Skills
backend-architect— architecture decisionsdatabase-architect— schema designdrizzle-orm-expert— Node.js ORM alternative
Gives 1 of the 12 instructions most data backend skills give in 686 tokens
Counted across 229 of the 229 authors here whose files we hold, read 2026-08-07
- separate business logic into service layersin 22 of 229, across 15 files
- retry failures with exponential backoffin 21 of 229, across 14 files
- select only needed database columnsin 20 of 229, across 13 files
- abstract data access into repository classesin 19 of 229, across 12 files
- use centralized error handlersin 17 of 229, across 10 files
- Use AsNoTracking for read-only querieshere, and in 16 of 229, across 4 files
- Use async/await for all I/O operationsin 16 of 229, across 5 files
- implement structured loggingin 15 of 229, across 4 files
- Use dependency injection for all servicesin 14 of 229, across 2 files
- use resource-based URLs for REST APIsin 13 of 229, across 7 files
- invalidate cache after data changesin 13 of 229, across 9 files
- Use a dependency injection containerin 12 of 229, across 4 files
Said here and by no other author read
- Avoid N+1 queries using Include or projection
- Use compiled queries for hot paths
- Write integration tests with WebApplicationFactory
- Register HttpClient with AddHttpClient
- Use global exception handlers
- Register dependencies using service lifetimes
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.