/// <summary> /// <see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IBankAppService"/> /// </summary> /// <param name="bankAccountDTO"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IBankAppService"/></param> /// <returns><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IBankAppService"/></returns> public BankAccountDTO AddBankAccount(BankAccountDTO bankAccountDTO) { if (bankAccountDTO == null || bankAccountDTO.CustomerId == Guid.Empty) throw new ArgumentException(Messages.warning_CannotAddNullBankAccountOrInvalidCustomer); //check if exists the customer for this bank account var associatedCustomer = _customerRepository.Get(bankAccountDTO.CustomerId); if (associatedCustomer != null) // if the customer exist { //Create a new bank account number var accountNumber = CalculateNewBankAccountNumber(); //Create account from factory var account = BankAccountFactory.CreateBankAccount(associatedCustomer, accountNumber); //save bank account SaveBankAccount(account); return account.ProjectedAs<BankAccountDTO>(); } else //the customer for this bank account not exist, cannot create a new bank account throw new InvalidOperationException(Messages.warning_CannotCreateBankAccountForNonExistingCustomer); }
bool BankAccountHasIdentity(BankAccountDTO bankAccountDTO) { //return true is bank account dto has identity return (bankAccountDTO != null && bankAccountDTO.Id != Guid.Empty); }
/// <summary> /// <see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IMainBoundedContextService"/> /// </summary> /// <param name="from"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IMainBoundedContextService"/></param> /// <param name="to"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IMainBoundedContextService"/></param> /// <param name="amount"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IMainBoundedContextService"/></param> public void PerformTransfer(BankAccountDTO from, BankAccountDTO to, decimal amount) { _bankAppService.PerformBankTransfer(from, to, amount); }
/// <summary> /// <see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IBankAppService"/> /// </summary> /// <param name="fromAccount"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IBankAppService"/></param> /// <param name="toAccount"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IBankAppService"/></param> /// <param name="amount"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IBankAppService"/></param> public void PerformBankTransfer(BankAccountDTO fromAccount, BankAccountDTO toAccount, decimal amount) { //Application-Logic Process: // 1º Get Accounts objects from Repositories // 2º Start Transaction // 3º Call PerformTransfer method in Domain Service // 4º If no exceptions, commit the unit of work and complete transaction if (BankAccountHasIdentity(fromAccount) && BankAccountHasIdentity(toAccount)) { var source = _bankAccountRepository.Get(fromAccount.Id); var target = _bankAccountRepository.Get(toAccount.Id); if (source != null & target != null) // if all accounts exist { using (TransactionScope scope = new TransactionScope()) { //perform transfer _transferService.PerformTransfer(amount, source, target); //comit unit of work _bankAccountRepository.UnitOfWork.Commit(); //complete transaction scope.Complete(); } } else LoggerFactory.CreateLog().LogError(Messages.error_CannotPerformTransferInvalidAccounts); } else LoggerFactory.CreateLog().LogError(Messages.error_CannotPerformTransferInvalidAccounts); }
/// <summary> /// <see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IMainBoundedContextService"/> /// </summary> /// <param name="newBankAccount"><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IMainBoundedContextService"/></param> /// <returns><see cref="Microsoft.Samples.NLayerApp.Application.MainBoundedContext.BankingModule.Services.IMainBoundedContextService"/></returns> public BankAccountDTO AddNewBankAccount(BankAccountDTO newBankAccount) { return _bankAppService.AddBankAccount(newBankAccount); }
public void PerformBankTransfer() { //Arrange //--> source bank account data var sourceId = new Guid("3481009C-A037-49DB-AE05-44FF6DB67DEC"); var bankAccountNumberSource = new BankAccountNumber("4444", "5555", "3333333333", "02"); var sourceCustomer = new Customer(); sourceCustomer.GenerateNewIdentity(); var source = BankAccountFactory.CreateBankAccount(sourceCustomer, bankAccountNumberSource); source.ChangeCurrentIdentity(sourceId); source.DepositMoney(1000, "initial"); var sourceBankAccountDTO = new BankAccountDTO() { Id = sourceId, BankAccountNumber = source.Iban }; //--> target bank account data var targetCustomer = new Customer(); targetCustomer.GenerateNewIdentity(); var targetId = new Guid("8A091975-F783-4730-9E03-831E9A9435C1"); var bankAccountNumberTarget = new BankAccountNumber("1111", "2222", "3333333333", "01"); var target = BankAccountFactory.CreateBankAccount(targetCustomer, bankAccountNumberTarget); target.ChangeCurrentIdentity(targetId); var targetBankAccountDTO = new BankAccountDTO() { Id = targetId, BankAccountNumber = target.Iban }; var accounts = new List<BankAccount>() { source, target }; SIBankAccountRepository bankAccountRepository = new SIBankAccountRepository(); bankAccountRepository.GetGuid = (guid) => { return accounts.Where(ba => ba.Id == guid).SingleOrDefault(); }; bankAccountRepository.UnitOfWorkGet = () => { var unitOfWork = new SIUnitOfWork(); unitOfWork.Commit = () => { }; return unitOfWork; }; SICustomerRepository customerRepository = new SICustomerRepository(); IBankTransferService transferService = new BankTransferService(); IBankAppService bankingService = new BankAppService(bankAccountRepository, customerRepository, transferService); //Act bankingService.PerformBankTransfer(sourceBankAccountDTO, targetBankAccountDTO, 100M); //Assert Assert.AreEqual(source.Balance, 900); Assert.AreEqual(target.Balance, 100); }
public void AddBankAccountReturnDTOWhenSaveSucceed() { //Arrange IBankTransferService transferService = new BankTransferService(); SICustomerRepository customerRepository = new SICustomerRepository(); customerRepository.GetGuid = (guid) => { var customer = new Customer() { FirstName = "Jhon", LastName = "El rojo" }; customer.ChangeCurrentIdentity(guid); return customer; }; SIBankAccountRepository bankAccountRepository = new SIBankAccountRepository(); bankAccountRepository.AddBankAccount = (ba) => { }; bankAccountRepository.UnitOfWorkGet = () => { var uow = new SIUnitOfWork(); uow.Commit = () => { }; return uow; }; var dto = new BankAccountDTO() { CustomerId = Guid.NewGuid(), BankAccountNumber = "BA" }; IBankAppService bankingService = new BankAppService(bankAccountRepository, customerRepository, transferService); //Act var result = bankingService.AddBankAccount(dto); //Assert Assert.IsNotNull(result); }
public void AddBankAccountThrowInvalidOperationExceptionWhenCustomerNotExist() { //Arrange SIBankAccountRepository bankAccountRepository = new SIBankAccountRepository(); SICustomerRepository customerRepository = new SICustomerRepository(); customerRepository.GetGuid = (guid) => { return null; }; IBankTransferService transferService = new BankTransferService(); var dto = new BankAccountDTO() { CustomerId = Guid.NewGuid() }; IBankAppService bankingService = new BankAppService(bankAccountRepository, customerRepository, transferService); //Act bankingService.AddBankAccount(dto); }
public void AddBankAccountReturnNullWhenCustomerIdIsEmpty() { //Arrange SIBankAccountRepository bankAccountRepository = new SIBankAccountRepository(); SICustomerRepository customerRepository = new SICustomerRepository(); IBankTransferService transferService = new BankTransferService(); var dto = new BankAccountDTO() { CustomerId = Guid.Empty }; IBankAppService bankingService = new BankAppService(bankAccountRepository, customerRepository, transferService); //Act var result = bankingService.AddBankAccount(dto); }