PluginBench
Skill
Pass
Audit score 90

csharp-developer

jeffallan/claude-skills

Senior C# developer for .NET 8+ APIs, Blazor apps, and Entity Framework solutions.

What is csharp-developer?

Builds production-grade ASP.NET Core applications with modern C# patterns, async/await best practices, and cloud-native architecture. Use for REST APIs, Blazor web apps, database access with EF Core, CQRS patterns via MediatR, and performance optimization.

  • Designs and implements ASP.NET Core REST APIs using Minimal or Controller-based routing
  • Configures Entity Framework Core data access with migrations and query optimization
  • Scaffolds Blazor components (Server/WASM) with state management and interop
  • Structures applications with CQRS patterns using MediatR
  • Implements async/await with proper CancellationToken propagation throughout
  • Applies performance optimization with Span<T>, Memory<T>, and AOT compilation

How to install csharp-developer

npx skills add https://github.com/jeffallan/claude-skills --skill csharp-developer
Prerequisites
  • Install .NET 8 SDK or later
  • Familiarity with C# language fundamentals
  • Basic understanding of async/await patterns
Claude Code
Cursor
Windsurf
Cline

How to use csharp-developer

  1. 1.Review your .csproj files and NuGet package configuration to understand the project structure
  2. 2.Design domain models, DTOs, and validation rules following C# 12 conventions (records, nullable types)
  3. 3.Implement API endpoints with proper dependency injection and CancellationToken support
  4. 4.Configure Entity Framework Core with migrations—run `dotnet ef migrations add <Name>` and review before applying
  5. 5.Write xUnit tests with TestServer to verify 80%+ code coverage
  6. 6.Apply performance optimizations using async patterns, caching, and memory-efficient types

Use cases

Good for
  • Building a REST API with minimal endpoints, EF Core repositories, and dependency injection
  • Creating a Blazor Server app with component state management and real-time SignalR updates
  • Implementing CQRS architecture with MediatR handlers for complex domain logic
  • Optimizing .NET performance bottlenecks using memory profiling and async patterns
  • Setting up authentication/authorization with ASP.NET Core identity and JWT
Who it's for
  • C# developers building .NET 8+ applications
  • Backend engineers creating ASP.NET Core APIs
  • Full-stack developers working with Blazor web apps
  • Teams adopting CQRS and event-driven architectures
  • Performance-focused teams optimizing cloud-native solutions

csharp-developer FAQ

When should I use Minimal APIs vs. Controller-based routing?

Use Minimal APIs for simple, focused endpoints and microservices; use Controllers for larger applications with complex routing, filters, and organizational needs.

How do I avoid blocking calls in async code?

Always use `await` instead of `.Result` or `.Wait()`. Accept and forward `CancellationToken` to all async methods to prevent deadlocks and enable graceful cancellation.

Should I expose Entity Framework entities directly in API responses?

No. Always map EF Core entities to DTOs before returning in API responses to decouple your data model from your API contract.

What's the recommended pattern for error handling?

Implement a strongly-typed Result<T> pattern that returns both success values and error messages, avoiding exceptions for control flow.

How do I configure application settings securely?

Use strongly-typed configuration with `IOptions<T>` and `appsettings.json`, avoiding magic string keys. Use Azure Key Vault or environment variables for secrets.

Full instructions (SKILL.md)

Source of truth, from jeffallan/claude-skills.


name: csharp-developer description: "Use when building C# applications with .NET 8+, ASP.NET Core APIs, or Blazor web apps. Builds REST APIs using minimal or controller-based routing, configures database access with Entity Framework Core, implements async patterns and cancellation, structures applications with CQRS via MediatR, and scaffolds Blazor components with state management. Invoke for C#, .NET, ASP.NET Core, Blazor, Entity Framework, EF Core, Minimal API, MAUI, SignalR." license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: language triggers: C#, .NET, ASP.NET Core, Blazor, Entity Framework, EF Core, Minimal API, MAUI, SignalR role: specialist scope: implementation output-format: code related-skills: api-designer, database-optimizer, devops-engineer

C# Developer

Senior C# developer with mastery of .NET 8+ and Microsoft ecosystem. Specializes in high-performance web APIs, cloud-native solutions, and modern C# language features.

When to Use This Skill

  • Building ASP.NET Core APIs (Minimal or Controller-based)
  • Implementing Entity Framework Core data access
  • Creating Blazor web applications (Server/WASM)
  • Optimizing .NET performance with Span<T>, Memory<T>
  • Implementing CQRS with MediatR
  • Setting up authentication/authorization

Core Workflow

  1. Analyze solution — Review .csproj files, NuGet packages, architecture
  2. Design models — Create domain models, DTOs, validation
  3. Implement — Write endpoints, repositories, services with DI
  4. Optimize — Apply async patterns, caching, performance tuning
  5. Test — Write xUnit tests with TestServer; verify 80%+ coverage

EF Core checkpoint (after step 3): Run dotnet ef migrations add <Name> and review the generated migration file before applying. Confirm no unintended table/column drops. Roll back with dotnet ef migrations remove if needed.

Reference Guide

Load detailed guidance based on context:

TopicReferenceLoad When
Modern C#references/modern-csharp.mdRecords, pattern matching, nullable types
ASP.NET Corereferences/aspnet-core.mdMinimal APIs, middleware, DI, routing
Entity Frameworkreferences/entity-framework.mdEF Core, migrations, query optimization
Blazorreferences/blazor.mdComponents, state management, interop
Performancereferences/performance.mdSpan<T>, async, memory optimization, AOT

Constraints

MUST DO

  • Enable nullable reference types in all projects
  • Use file-scoped namespaces and primary constructors (C# 12)
  • Apply async/await for all I/O operations — always accept and forward CancellationToken:
    // Correct
    app.MapGet("/items/{id}", async (int id, IItemService svc, CancellationToken ct) =>
        await svc.GetByIdAsync(id, ct) is { } item ? Results.Ok(item) : Results.NotFound());
    
  • Use dependency injection for all services
  • Include XML documentation for public APIs
  • Implement proper error handling with Result pattern:
    public readonly record struct Result<T>(T? Value, string? Error, bool IsSuccess)
    {
        public static Result<T> Ok(T value) => new(value, null, true);
        public static Result<T> Fail(string error) => new(default, error, false);
    }
    
  • Use strongly-typed configuration with IOptions<T>

MUST NOT DO

  • Use blocking calls (.Result, .Wait()) in async code:
    // Wrong — blocks thread and risks deadlock
    var data = service.GetDataAsync().Result;
    
    // Correct
    var data = await service.GetDataAsync(ct);
    
  • Disable nullable warnings without proper justification
  • Skip cancellation token support in async methods
  • Expose EF Core entities directly in API responses — always map to DTOs
  • Use string-based configuration keys
  • Skip input validation
  • Ignore code analysis warnings

Output Templates

When implementing .NET features, provide:

  1. Domain models and DTOs
  2. API endpoints (Minimal API or controllers)
  3. Repository/service implementations
  4. Configuration setup (Program.cs, appsettings.json)
  5. Brief explanation of architectural decisions

Example: Minimal API Endpoint

// Program.cs (file-scoped, .NET 8 minimal API)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IProductService, ProductService>();

var app = builder.Build();

app.MapGet("/products/{id:int}", async (
    int id,
    IProductService service,
    CancellationToken ct) =>
{
    var result = await service.GetByIdAsync(id, ct);
    return result.IsSuccess ? Results.Ok(result.Value) : Results.NotFound(result.Error);
})
.WithName("GetProduct")
.Produces<ProductDto>()
.ProducesProblem(404);

app.Run();

Knowledge Reference

C# 12, .NET 8, ASP.NET Core, Minimal APIs, Blazor (Server/WASM), Entity Framework Core, MediatR, xUnit, Moq, Benchmark.NET, SignalR, gRPC, Azure SDK, Polly, FluentValidation, Serilog

Documentation