# Domain Layer Define domain entities, value objects, and events. ## Create Order Entity ```csharp // OrderManagement.Domain/Entities/Order.cs namespace OrderManagement.Domain.Entities; public class Order { public int Id { get; private set; } public int CustomerId { get; private set; } public OrderStatus Status { get; private set; } public decimal TotalAmount { get; private set; } public DateTimeOffset PlacedAt { get; private set; } private readonly List _items = new(); public IReadOnlyList Items => _items.AsReadOnly(); private Order() { } // EF Core public static Order Create(int customerId, List items) { if (!items.Any()) throw new InvalidOperationException("Order must have at least one item"); var order = new Order { CustomerId = customerId, Status = OrderStatus.Placed, PlacedAt = DateTimeOffset.UtcNow }; order._items.AddRange(items); order.TotalAmount = items.Sum(i => i.Price * i.Quantity); return order; } public void Ship() { if (Status != OrderStatus.Placed) throw new InvalidOperationException($"Cannot ship order in {Status} status"); Status = OrderStatus.Shipped; } public void Cancel() { if (Status == OrderStatus.Shipped) throw new InvalidOperationException("Cannot cancel shipped order"); Status = OrderStatus.Cancelled; } } public class OrderItem { public int ProductId { get; set; } public string ProductName { get; set; } = string.Empty; public int Quantity { get; set; } public decimal Price { get; set; } } public enum OrderStatus { Placed, Shipped, Cancelled } ``` ## Domain Events ```csharp // OrderManagement.Domain/Events/OrderPlacedEvent.cs namespace OrderManagement.Domain.Events; public record OrderPlacedEvent { public int OrderId { get; init; } public int CustomerId { get; init; } public decimal TotalAmount { get; init; } public DateTimeOffset PlacedAt { get; init; } public List Items { get; init; } = new(); } ``` ## Next Steps Continue to [CQRS Layer](03-cqrs-layer.md)