PropertyCare is a portfolio backend project designed to demonstrate production-grade ASP.NET Core architecture and engineering practices. It models a property maintenance management system where tenants, owners, and contractors interact through maintenance workflows.
- Clean Architecture multi-project solution
- ASP.NET Core Web API (.NET 10)
- EF Core + PostgreSQL
- JWT Authentication
- Role-based authorization
- Soft deletes
- Automatic timestamps
- Audit logging
- Pagination + filtering
- Domain-driven status transitions
- Dockerized database setup
- Users (Tenant / Contractor / Admin)
- Properties
- Maintenance Requests
- Audit Logs
src/
PropertyCareApi.Web -> ASP.NET host, controllers
PropertyCareApi.Application -> DTOs, interfaces
PropertyCareApi.Domain -> Entities & domain logic
PropertyCareApi.Infrastructure -> EF Core, persistence
Dependency flow:
Domain
^
Application
^
Infrastructure
^
Web
- .NET 10
- ASP.NET Core Web API
- Entity Framework Core
- PostgreSQL
- Docker / Docker Compose
- BCrypt password hashing
- Fluent API entity configuration
Install the following:
- .NET SDK 10
- Docker Desktop
- EF CLI tools
dotnet tool install --global dotnet-efgit clone <repo-url>
cd PropertyCaredocker compose up -dThis starts the database container defined in docker-compose.yml.
From the repo root:
dotnet ef database update \
--project src/PropertyCare.Infrastructure \
--startup-project src/PropertyCare.Webdotnet run --project src/PropertyCare.WebopenAPI will be available at:
https://localhost:xxxx/openapi/v1.json
Configuration lives in:
src/PropertyCare.Web/appsettings.json
Important values:
- Connection string
- JWT secret / issuer / audience
For production-like setups, override via environment variables.
If you need a clean state:
docker compose down -v
docker compose up -d
dotnet ef database update \
--project src/PropertyCare.Infrastructure \
--startup-project src/PropertyCare.WebThis project is used to deepen expertise in:
- ASP.NET Core backend architecture
- EF Core performance patterns
- Authorization models
- Observability and logging
- Testing strategies
- Event-driven evolution
It intentionally evolves toward production-level patterns without premature enterprise complexity.
- Resource-based authorization
- Global validation + error handling
- Integration testing with containers
- Structured logging (Serilog)
- Background processing
- Redis caching
- Messaging (RabbitMQ)
- Identity provider integration