my-code-codex

OrderCanBeApprovedSpecification

Specification: encapsula uma regra de negócio reutilizável e combinável. Permite composição via .And().

namespace Domain.Specifications;

public class OrderCanBeApprovedSpecification
{
    public bool IsSatisfiedBy(Order order) =>
        order.Status == OrderStatus.Pending && order.Total > 0;
}

// Exemplo de composição de specifications
public abstract class Specification<T>
{
    public abstract bool IsSatisfiedBy(T entity);

    public Specification<T> And(Specification<T> other) =>
        new AndSpecification<T>(this, other);
}

public class AndSpecification<T> : Specification<T>
{
    private readonly Specification<T> _left;
    private readonly Specification<T> _right;

    public AndSpecification(Specification<T> left, Specification<T> right)
    {
        _left = left;
        _right = right;
    }

    public override bool IsSatisfiedBy(T entity) =>
        _left.IsSatisfiedBy(entity) && _right.IsSatisfiedBy(entity);
}