publicsealedclassRegister:IUseCase{publicasyncTaskExecute(RegisterInputinput){varcustomer=_entityFactory.NewCustomer(input.SSN,input.Name);varaccount=_entityFactory.NewAccount(customer);varcredit=account.Deposit(_entityFactory,input.InitialAmount);customer.Register(account);await_customerRepository.Add(customer);await_accountRepository.Add(account,credit);await_unitOfWork.Save();varoutput=newRegisterOutput(customer,account);_outputPort.Standard(output);}// properties and constructor ommited}
publicsealedclassAccountRepository:IAccountRepository{privatereadonlyMangaContext_context;publicAccountRepository(MangaContextcontext){_context=context??thrownewArgumentNullException(nameof(context));}publicasyncTaskAdd(IAccountaccount,ICreditcredit){await_context.Accounts.AddAsync((EntityFrameworkDataAccess.Account)account);await_context.Credits.AddAsync((EntityFrameworkDataAccess.Credit)credit);}publicasyncTaskDelete(IAccountaccount){stringdeleteSQL=@"DELETE FROM Credit WHERE AccountId = @Id;
DELETE FROM Debit WHERE AccountId = @Id;
DELETE FROM Account WHERE Id = @Id;";varid=newSqlParameter("@Id",account.Id);intaffectedRows=await_context.Database.ExecuteSqlRawAsync(deleteSQL,id);}publicasyncTask<IAccount>Get(Guidid){Infrastructure.EntityFrameworkDataAccess.Accountaccount=await_context.Accounts.Where(a=>a.Id==id).SingleOrDefaultAsync();if(accountisnull)thrownewAccountNotFoundException($"The account {id} does not exist or is not processed yet.");varcredits=_context.Credits.Where(e=>e.AccountId==id).ToList();vardebits=_context.Debits.Where(e=>e.AccountId==id).ToList();account.Load(credits,debits);returnaccount;}publicasyncTaskUpdate(IAccountaccount,ICreditcredit){await_context.Credits.AddAsync((EntityFrameworkDataAccess.Credit)credit);}publicasyncTaskUpdate(IAccountaccount,IDebitdebit){await_context.Debits.AddAsync((EntityFrameworkDataAccess.Debit)debit);}}
/// <summary>/// Get an account details/// </summary>[HttpGet("{AccountId}",Name="GetAccount")][ProducesResponseType(StatusCodes.Status200OK,Type=typeof(GetAccountDetailsResponse))][ProducesResponseType(StatusCodes.Status404NotFound)]publicasyncTask<IActionResult>Get([FromRoute][Required]GetAccountDetailsRequestrequest){varinput=newGetAccountDetailsInput(request.AccountId);await_useCase.Execute(input);return_presenter.ViewModel;}
/// <summary>/// Get an account details/// </summary>[HttpGet("{AccountId}",Name="GetAccount")][ProducesResponseType(StatusCodes.Status200OK,Type=typeof(GetAccountDetailsResponse))][ProducesResponseType(StatusCodes.Status404NotFound)]publicasyncTask<IActionResult>Get([FromRoute][Required]GetAccountDetailsRequestrequest){varinput=newGetAccountDetailsInput(request.AccountId);await_mediator.PublishAsync(input);return_presenter.ViewModel;}