← ClaudeAtlas

dddlisted

Domain-Driven Design patterns for .NET — aggregates, value objects, strongly-typed IDs, domain events, repositories, and layer rules.
zdanovichnick/dotnet-pilot · ★ 3 · AI & Automation · score 76
Install: claude install-skill zdanovichnick/dotnet-pilot
# Domain-Driven Design Patterns Reference material for applying DDD tactical patterns in .NET. Used by `dnp-architect` and `dnp-planner`. ## When to Use DDD Use DDD when: 3+ aggregates with complex business rules, cross-aggregate invariants that need enforcement, or event sourcing is being considered. For simpler CRUD-heavy APIs, Vertical Slice Architecture is lower ceremony. See `knowledge/decisions/adr-005-multi-architecture.md`. ## Aggregate Root Base All changes to an aggregate go through the root — never modify child entities directly from outside. ```csharp // Domain/Common/AggregateRoot.cs public abstract class AggregateRoot<TId> { private readonly List<IDomainEvent> _events = []; public TId Id { get; protected set; } = default!; public IReadOnlyList<IDomainEvent> DomainEvents => _events.AsReadOnly(); protected void Raise(IDomainEvent @event) => _events.Add(@event); public void ClearEvents() => _events.Clear(); } ``` ## Aggregate Example ```csharp // Domain/Orders/Order.cs public sealed class Order : AggregateRoot<OrderId> { private readonly List<OrderItem> _items = []; public IReadOnlyList<OrderItem> Items => _items.AsReadOnly(); public CustomerId CustomerId { get; private set; } = null!; public OrderStatus Status { get; private set; } public Money Total { get; private set; } = Money.Zero; private Order() { } // required by EF Core public static Order Create(CustomerId customerId, IReadOnlyList<CreateOrderItemD