Create domain models following Domain-Driven Design principles
I help you create domain models following DDD principles:
Use this skill when:
src/{ProjectName}.Domain/
āāā Entities/
ā āāā Product.cs
ā āāā Order.cs
ā āāā Customer.cs
āāā ValueObjects/
ā āāā Money.cs
ā āāā Email.cs
ā āāā Address.cs
āāā Aggregates/
ā āāā OrderAggregate/
ā āāā Order.cs
ā āāā OrderItem.cs
āāā Interfaces/
ā āāā IProductRepository.cs
ā āāā IOrderRepository.cs
ā āāā IUnitOfWork.cs
āāā Events/
ā āāā OrderCreatedEvent.cs
ā āāā OrderPaidEvent.cs
āāā Services/
āāā DomainService.cs
public abstract class Entity
{
public Guid Id { get; protected set; }
public DateTime CreatedAt { get; protected set; }
public DateTime? UpdatedAt { get; protected set; }
public List<IDomainEvent> DomainEvents { get; } = new();
protected Entity(Guid id) => Id = id;
protected Entity() { }
}
public abstract class ValueObject : IEquatable<ValueObject>
{
protected abstract IEnumerable<object> GetEqualityComponents();
public bool Equals(ValueObject? other)
{
if (other is null) return false;
if (ReferenceEquals(this, other)) return true;
return GetEqualityComponents()
.SequenceEqual(other.GetEqualityComponents());
}
}
public abstract class AggregateRoot : Entity
{
public override void RaiseDomainEvent(IDomainEvent domainEvent)
{
DomainEvents.Add(domainEvent);
}
public void ClearDomainEvents() => DomainEvents.Clear();
}
Create a domain model for an e-commerce system with:
- Product entity
- Order aggregate root
- Money value object
- OrderCreated domain event
- Repository interfaces
I will generate complete domain model following DDD patterns.