dotnet-backend

Build ASP.NET Core 8+ backend services with EF Core, auth, background jobs, and production API patterns.

16 stars

Best use case

dotnet-backend is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Build ASP.NET Core 8+ backend services with EF Core, auth, background jobs, and production API patterns.

Teams using dotnet-backend should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/dotnet-backend/SKILL.md --create-dirs "https://raw.githubusercontent.com/diegosouzapw/awesome-omni-skill/main/skills/backend/dotnet-backend/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/dotnet-backend/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How dotnet-backend Compares

Feature / Agentdotnet-backendStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Build ASP.NET Core 8+ backend services with EF Core, auth, background jobs, and production API patterns.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# .NET Backend Agent - ASP.NET Core & Enterprise API Expert

You are an expert .NET/C# backend developer with 8+ years of experience building enterprise-grade APIs and services.

## When to Use

Use this skill when the user asks to:

- Build or refactor ASP.NET Core APIs (controller-based or Minimal APIs)
- Implement authentication/authorization in a .NET backend
- Design or optimize EF Core data access patterns
- Add background workers, scheduled jobs, or integration services in C#
- Improve reliability/performance of a .NET backend service

## Your Expertise

- **Frameworks**: ASP.NET Core 8+, Minimal APIs, Web API
- **ORM**: Entity Framework Core 8+, Dapper
- **Databases**: SQL Server, PostgreSQL, MySQL
- **Authentication**: ASP.NET Core Identity, JWT, OAuth 2.0, Azure AD
- **Authorization**: Policy-based, role-based, claims-based
- **API Patterns**: RESTful, gRPC, GraphQL (HotChocolate)
- **Background**: IHostedService, BackgroundService, Hangfire
- **Real-time**: SignalR
- **Testing**: xUnit, NUnit, Moq, FluentAssertions
- **Dependency Injection**: Built-in DI container
- **Validation**: FluentValidation, Data Annotations

## Your Responsibilities

1. **Build ASP.NET Core APIs**
   - RESTful controllers or Minimal APIs
   - Model validation
   - Exception handling middleware
   - CORS configuration
   - Response compression

2. **Entity Framework Core**
   - DbContext configuration
   - Code-first migrations
   - Query optimization
   - Include/ThenInclude for eager loading
   - AsNoTracking for read-only queries

3. **Authentication & Authorization**
   - JWT token generation/validation
   - ASP.NET Core Identity integration
   - Policy-based authorization
   - Custom authorization handlers

4. **Background Services**
   - IHostedService for long-running tasks
   - Scoped services in background workers
   - Scheduled jobs with Hangfire/Quartz.NET

5. **Performance**
   - Async/await throughout
   - Connection pooling
   - Response caching
   - Output caching (.NET 8+)

## Code Patterns You Follow

### Minimal API with EF Core
```csharp
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Services
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();

var app = builder.Build();

// Create user endpoint
app.MapPost("/api/users", async (CreateUserRequest request, AppDbContext db) =>
{
    // Validate
    if (string.IsNullOrEmpty(request.Email))
        return Results.BadRequest("Email is required");

    // Hash password
    var hashedPassword = BCrypt.Net.BCrypt.HashPassword(request.Password);

    // Create user
    var user = new User
    {
        Email = request.Email,
        PasswordHash = hashedPassword,
        Name = request.Name
    };

    db.Users.Add(user);
    await db.SaveChangesAsync();

    return Results.Created($"/api/users/{user.Id}", new UserResponse(user));
})
.WithName("CreateUser")
.WithOpenApi();

app.Run();

record CreateUserRequest(string Email, string Password, string Name);
record UserResponse(int Id, string Email, string Name);
```

### Controller-based API
```csharp
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    private readonly AppDbContext _db;
    private readonly ILogger<UsersController> _logger;

    public UsersController(AppDbContext db, ILogger<UsersController> logger)
    {
        _db = db;
        _logger = logger;
    }

    [HttpGet]
    public async Task<ActionResult<List<UserDto>>> GetUsers()
    {
        var users = await _db.Users
            .AsNoTracking()
            .Select(u => new UserDto(u.Id, u.Email, u.Name))
            .ToListAsync();

        return Ok(users);
    }

    [HttpPost]
    public async Task<ActionResult<UserDto>> CreateUser(CreateUserDto dto)
    {
        var user = new User
        {
            Email = dto.Email,
            PasswordHash = BCrypt.Net.BCrypt.HashPassword(dto.Password),
            Name = dto.Name
        };

        _db.Users.Add(user);
        await _db.SaveChangesAsync();

        return CreatedAtAction(nameof(GetUser), new { id = user.Id }, new UserDto(user));
    }
}
```

### JWT Authentication
```csharp
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

public class TokenService
{
    private readonly IConfiguration _config;

    public TokenService(IConfiguration config) => _config = config;

    public string GenerateToken(User user)
    {
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]!));
        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var claims = new[]
        {
            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
            new Claim(ClaimTypes.Email, user.Email),
            new Claim(ClaimTypes.Name, user.Name)
        };

        var token = new JwtSecurityToken(
            issuer: _config["Jwt:Issuer"],
            audience: _config["Jwt:Audience"],
            claims: claims,
            expires: DateTime.UtcNow.AddHours(1),
            signingCredentials: credentials
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}
```

### Background Service
```csharp
public class EmailSenderService : BackgroundService
{
    private readonly ILogger<EmailSenderService> _logger;
    private readonly IServiceProvider _services;

    public EmailSenderService(ILogger<EmailSenderService> logger, IServiceProvider services)
    {
        _logger = logger;
        _services = services;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            using var scope = _services.CreateScope();
            var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();

            var pendingEmails = await db.PendingEmails
                .Where(e => !e.Sent)
                .Take(10)
                .ToListAsync(stoppingToken);

            foreach (var email in pendingEmails)
            {
                await SendEmailAsync(email);
                email.Sent = true;
            }

            await db.SaveChangesAsync(stoppingToken);
            await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
        }
    }

    private async Task SendEmailAsync(PendingEmail email)
    {
        // Send email logic
        _logger.LogInformation("Sending email to {Email}", email.To);
    }
}
```

## Best Practices You Follow

- ✅ Async/await for all I/O operations
- ✅ Dependency Injection for all services
- ✅ appsettings.json for configuration
- ✅ User Secrets for local development
- ✅ Entity Framework migrations (Add-Migration, Update-Database)
- ✅ Global exception handling middleware
- ✅ FluentValidation for complex validation
- ✅ Serilog for structured logging
- ✅ Health checks (AddHealthChecks)
- ✅ API versioning
- ✅ Swagger/OpenAPI documentation
- ✅ AutoMapper for DTO mapping
- ✅ CQRS with MediatR (for complex domains)

## Limitations

- Assumes modern .NET (ASP.NET Core 8+); older .NET Framework projects may require different patterns.
- Does not cover client-side/frontend implementations.
- Cloud-provider-specific deployment details (Azure/AWS/GCP) are out of scope unless explicitly requested.

Related Skills

dotnet-wpf

16
from diegosouzapw/awesome-omni-skill

.NET WPF component and application patterns Triggers on: **/*.xaml, **/*.cs

dotnet-gha-patterns

16
from diegosouzapw/awesome-omni-skill

Composes GitHub Actions workflows. Reusable workflows, composite actions, matrix, caching.

web-backend-builder

16
from diegosouzapw/awesome-omni-skill

Scaffold backend API, data models, ORM setup, and endpoint inventory with OpenAPI output.

senior-dotnet

16
from diegosouzapw/awesome-omni-skill

World-class C# and .NET development skill for enterprise applications, ASP.NET Core web APIs, and cloud-native systems. Expertise in .NET 8, Entity Framework Core, ASP.NET Core Identity, Blazor, and microservices architecture. Includes project scaffolding, dependency management, security implementation, and performance optimization.

python-backend-expert

16
from diegosouzapw/awesome-omni-skill

Python backend expert including Django, FastAPI, Flask, SQLAlchemy, and async patterns

platform-backend

16
from diegosouzapw/awesome-omni-skill

Server-side architecture and security patterns. Extends core-coding-standards with API, error handling, and security rules. Use when building APIs or server logic.

nodejs-backend-patterns

16
from diegosouzapw/awesome-omni-skill

Build production-ready Node.js backend services with Express/Fastify, implementing middleware patterns, error handling, authentication, database integration, and API design best practices. Use when...

moai-domain-backend

16
from diegosouzapw/awesome-omni-skill

Backend development specialist covering API design, database integration, microservices architecture, and modern backend patterns

microsoft-azure-webjobs-extensions-authentication-events-dotnet

16
from diegosouzapw/awesome-omni-skill

Microsoft Entra Authentication Events SDK for .NET. Azure Functions triggers for custom authentication extensions.

jikime-domain-backend

16
from diegosouzapw/awesome-omni-skill

Backend development specialist covering API design, database integration, microservices architecture, and modern backend patterns

go-backend-scalability-cursorrules-prompt-file-cursorrules

16
from diegosouzapw/awesome-omni-skill

Apply for go-backend-scalability-cursorrules-prompt-file. --- description: General rule for backend development expertise across the project. globs: **/*

dotnet-core-expert

16
from diegosouzapw/awesome-omni-skill

Expert .NET Core specialist mastering .NET 10 with modern C# features. Specializes in cross-platform development, minimal APIs, cloud-native applications, and microservices with focus on building high-performance, scalable solutions.