public async Task <TransferOutput> Handle( TransferCommand command, CancellationToken token) { var validationResult = await new TransferValidation() .ValidateAsync( command, token); if (!validationResult.IsValid) { return(new TransferOutput( null, null, validationResult)); } var idsForCheck = new List <Guid> { (Guid)command.AccountNumberFrom, (Guid)command.AccountNumberTo }; var(areExist, ids) = await _read .AreExist( idsForCheck, token); if (!areExist) { _logger.LogError($"Accounts with " + $"{ids.Select(s=>s)} " + "account numbers doesn't exist"); throw new AccountNotExistException( $"Accounts with " + $"{ids.Select(s => s.ToString())}" + " accounts number doesn't exist"); } var accounts = await _read .GetList( idsForCheck, token); accounts.ForEach(ac => { if (ac.AccountNumber == command.AccountNumberFrom) { ac.Withdraw((decimal)command.Amount); } ac.Deposit((decimal)command.Amount); }); await _write .UnitOfWork .SaveEntitiesAsync(token); var sourceAccount = accounts .FirstOrDefault(ac => ac.AccountNumber == command.AccountNumberFrom); return(new TransferOutput( sourceAccount.AccountNumber, sourceAccount.Balance, validationResult)); }