Newer
Older
BloatedHandler / LessBloatedHandler.cs
@Derek Comartin Derek Comartin 27 days ago 2 KB Non functional example
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>
{
}