namespace BloatedHandler.LessBloated; public class LessBloatedHandler { private readonly DB _db; private readonly IEmailer _emailer; private readonly IEventPublisher _eventPublisher; private readonly ILogger _logger; public LessBloatedHandler(DB db, IEmailer emailer, IEventPublisher eventPublisher, ILogger logger) { _db = db; _emailer = emailer; _eventPublisher = eventPublisher; _logger = logger; } public void Handle(DispatchShipment command) { var shipment = _db.GetById(command.ShipmentId); if (shipment == null) { throw new InvalidOperationException("Shipment not found."); } shipment.Dispatch(); _db.Save(shipment); _emailer.NotifyCustomer(shipment); _eventPublisher.Publish(new ShipmentDispatched(shipment.Id, shipment.DispatchedAt)); _logger.Log($"Shipment {shipment.Id} dispatched."); } } public class Shipment { public Guid Id { get; private set; } public ShipmentStatus Status { get; private set; } public DateTime? DispatchedAt { get; private set; } public void Dispatch() { if (Status != ShipmentStatus.Ready) { throw new InvalidOperationException("Shipment is not ready."); } Status = ShipmentStatus.Dispatched; DispatchedAt = DateTime.UtcNow; } } public class DispatchShipment { public DispatchShipment(object shipmentId) { ShipmentId = shipmentId; } public object ShipmentId { get; set; } } public class ShipmentDispatched { public ShipmentDispatched(Guid id, object dispatchedAt) { throw new NotImplementedException(); } } public enum ShipmentStatus { Ready, Dispatched } public interface ILogger { void Log(string s); } public interface IEventPublisher { void Publish(ShipmentDispatched shipmentDispatched); } public interface IEmailer { void NotifyCustomer(object shipment); } public interface DB { void Save(object shipment); Shipment GetById(object shipmentId); } public interface ICommandHandler<T> { }