public TransferenciaServico(ITransferenciaRepositorio transferenciaRepositorio,
                                    IOperacaoServico operacaoServico,
                                    IContaServico contaServico,
                                    ITransacaoServico transacaoServico,
                                    IProdutorOperacoesClient produtorClient)
        {
            this.transferenciaRepositorio = transferenciaRepositorio;
            this.contaServico             = contaServico;
            this.transacaoServico         = transacaoServico;
            this.operacaoServico          = operacaoServico;
            this.produtorClient           = produtorClient;

            realizarOperacaoPeloTipo = new Action <Conta, decimal>[]
            {
                (conta, valor) => operacaoServico.Debitar(conta, valor),
                (conta, valor) => operacaoServico.Creditar(conta, valor)
            };
        }
        public void Efetivar(EfetivarOperacaoUnariaDto dto)
        {
            var cashOut = cashOutRepositorio.Get(dto.OperacaoId);

            try
            {
                var conta = contaServico.ObterConta(cashOut.ContaId);

                using (var transacao = transacaoServico.GerarNova())
                {
                    operacaoServico.Debitar(conta, cashOut.Valor + cashOut.ValorTaxa);
                    operacaoServico.MarcarEfetivada(cashOut);

                    transacao.Finalizar();
                }
            }
            catch (CarteiraDigitalException e)
            {
                operacaoServico.MarcarComErro(cashOut, e.Message);
            }

            cashOutRepositorio.Update(cashOut);
        }