public TransferValidator(ICheckingAccountService checkingAccountService) { RuleFor(transfer => transfer.NumberFrom) .Cascade(CascadeMode.StopOnFirstFailure) .NotEmpty() .NotNull() .Must(number => number > 0) .WithMessage("Número de conta origem inválido"); RuleFor(transfer => transfer.NumberTo) .Cascade(CascadeMode.StopOnFirstFailure) .NotEmpty() .NotNull() .Must(number => number > 0) .WithMessage("Número de conta destino inválido"); RuleFor(transfer => transfer.NumberFrom) .Cascade(CascadeMode.StopOnFirstFailure) .NotEqual(t => t.NumberTo) .WithMessage("Conta origem e conta destino devem ser diferentes"); RuleFor(transfer => transfer.Amount) .Cascade(CascadeMode.StopOnFirstFailure) .NotEmpty() .NotNull() .Must(number => number > 0) .WithMessage("Valor de transferência deve ser maior que zero"); RuleFor(transfer => transfer) .Cascade(CascadeMode.StopOnFirstFailure) .Custom((transfer, context) => { var checkingAccountFrom = checkingAccountService.GetByNumber(transfer.NumberFrom); if (checkingAccountFrom == null) { context.AddFailure("Conta origem não encontrada"); } if (checkingAccountFrom.UserId.ToString() != transfer.UserId) { context.AddFailure("Conta origem não pertence ao usuário logado"); } }); RuleFor(transfer => transfer) .Cascade(CascadeMode.StopOnFirstFailure) .Custom((transfer, context) => { var checkingAccountFrom = checkingAccountService.GetByNumber(transfer.NumberTo); if (checkingAccountFrom == null) { context.AddFailure("Conta destino não encontrada"); } }); }