cqrs-ddd

CQRS+DDD implementation patterns for .NET. Use when designing aggregates, implementing command/query handlers, setting up repositories, or understanding architectural principles. Triggers on "CQRS", "DDD", "aggregate", "command handler", "query handler", "repository", "value object", "domain event", "entity configuration".

$ 설치

git clone https://github.com/haru01/sample_university_management_system /tmp/sample_university_management_system && cp -r /tmp/sample_university_management_system/backend/.claude/skills/cqrs-ddd ~/.claude/skills/sample_university_management_system

// tip: Run this command in your terminal to install the skill


name: cqrs-ddd description: CQRS+DDD implementation patterns for .NET. Use when designing aggregates, implementing command/query handlers, setting up repositories, or understanding architectural principles. Triggers on "CQRS", "DDD", "aggregate", "command handler", "query handler", "repository", "value object", "domain event", "entity configuration".

CQRS+DDD Implementation Patterns

Comprehensive guide for implementing CQRS+DDD architecture in this .NET/EF Core codebase.

Quick Reference

Layer Dependencies

┌─────────────────┐
│   Api Layer     │  Controllers, Middleware
└────────┬────────┘
         │ depends on
         ▼
┌─────────────────┐
│Application Layer│  Commands, Queries, Handlers
└────────┬────────┘
         │ depends on
         ▼
┌─────────────────┐
│  Domain Layer   │◄──┐  Entities, Value Objects
└─────────────────┘   │
         ▲             │
         │ implements  │
┌────────┴────────┐   │
│Infrastructure   │───┘  Repositories, DbContext
└─────────────────┘

CQRS Separation

Command (Write)Query (Read)
Via Aggregate RootDirect DB query
Transaction requiredAsNoTracking()
Business rules applyPerformance priority

Domain Layer Patterns

// Entity Base
public abstract class Entity<TId> where TId : notnull
{
    public TId Id { get; protected set; }
}

// Aggregate Root
public abstract class AggregateRoot<TId> : Entity<TId>
{
    private readonly List<DomainEvent> _domainEvents = new();
    protected void AddDomainEvent(DomainEvent e) => _domainEvents.Add(e);
}

// Value Object (C# record)
public record StudentId(Guid Value);

Application Layer Patterns

// Command Handler
public class CreateCourseCommandHandler : IRequestHandler<CreateCourseCommand, string>
{
    public async Task<string> Handle(CreateCourseCommand request, CancellationToken ct)
    {
        var course = Course.Create(new CourseCode(request.Code), request.Name);
        await _repository.AddAsync(course, ct);
        await _repository.SaveChangesAsync(ct);
        return course.Id.Value;
    }
}

// Query Handler
public class GetCoursesQueryHandler : IRequestHandler<GetCoursesQuery, List<CourseDto>>
{
    public async Task<List<CourseDto>> Handle(GetCoursesQuery request, CancellationToken ct)
    {
        return await _context.Courses
            .AsNoTracking()
            .Select(c => new CourseDto { ... })
            .ToListAsync(ct);
    }
}

Infrastructure Layer Patterns

// Entity Configuration
public class EnrollmentConfiguration : IEntityTypeConfiguration<Enrollment>
{
    public void Configure(EntityTypeBuilder<Enrollment> builder)
    {
        builder.Property(e => e.Id)
            .HasConversion(v => v.Value, v => new EnrollmentId(v));
        builder.OwnsOne(e => e.Semester);
        builder.Ignore(e => e.DomainEvents);
    }
}

Key Rules

RuleDescription
1 Aggregate = 1 TransactionNo cross-aggregate changes in same transaction
ID References OnlyReference other aggregates by ID, not entity
1 Repository per AggregateOne repository per aggregate root
Validation in DomainValue objects validate on construction
No FluentValidationUse aggregate/value object validation

New Aggregate Checklist

StepActionFile/Location
1Create Flyway migrationMigrations/V{n}__*.sql
2Add DbSet to DbContext*DbContext.cs
3Create EntityConfigurationConfigurations/*Configuration.cs
4Implement RepositoryRepositories/*Repository.cs
5Register DIProgram.cs

Resources

FileContent
architecture.mdArchitectural principles, bounded contexts
domain-layer.mdEntity, Aggregate, Value Object patterns
application-layer.mdCQRS handlers, validation, transactions
infrastructure-layer.mdEF Core, repositories, migrations

Related Skills

Repository

haru01
haru01
Author
haru01/sample_university_management_system/backend/.claude/skills/cqrs-ddd
0
Stars
0
Forks
Updated4h ago
Added1w ago