mcba
a multi-tier asp.net core banking platform with customer and admin portals, bill payment system, account management, and rest api
A multi-tier banking platform built with ASP.NET Core. MCBA features separate customer and admin portals sharing a unified data layer, a RESTful API, an integrated bill payment system, and external data service synchronisation for real-time customer and account information.
key features
- Multi-portal architecture (customer app, admin app, REST API)
- User authentication with session management
- Account management with real-time balance calculations
- Transaction history with pagination and filtering
- Bill pay system with one-off and monthly scheduled payments
- Payee management for recurring bill payments
- Transaction types (deposits, withdrawals, transfers, service charges, bill payments)
- External data service integration for customer sync
- Custom validation attributes for business logic
- Role-based access control
tech stack
# backend
asp.net core mvc | entity framework core | sql server
# architecture
multi-project structure | repository pattern | dependency injection (autofac)
# frontend
razor views | bootstrap | javascript
api architecture
/api/customers # fetch and update customer data
/api/accounts # account information and balance
highlights
customer dashboard with transaction history, admin portal for user management, and bill payment system.


Building MCBA was my first real exposure to multi-project architecture. Splitting the app into separate model, customer, admin, and API layers made it clear how the same data layer can serve completely different consumers without duplicating logic.
The bill payment system was where the complexity lived. Managing scheduled one-off and monthly payments, validating payees, and keeping financial transactions accurate required careful business logic. Writing custom validation attributes like DateInThePast and HasMoreThanTwoDecimalPlaces was a good lesson in encapsulating domain rules in a reusable way rather than scattering checks across controllers.