Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
Integration Testing: Testing the API End to End with WebApplicationFactory
We cover integration testing: its difference from unit testing, what testing pieces together means, flowing a real request end to end with WebApplicationFactory, and using a separate test database.
Caching: In-Memory and Distributed Cache with Redis
We cover caching: improving performance by temporarily storing frequently requested but rarely changing data, the difference between in-memory and Redis-based distributed cache, and cache consistency.
Health Checks and Monitoring: Observing That the API Is Up and Healthy
We cover health checks and monitoring: automatically checking whether the application is healthy in production, observing dependencies like the database, the liveness/readiness distinction, and the basics of monitoring.
Containerizing with Docker: Putting the Application into a Package That Runs the Same Everywhere
We cover containerizing the application with Docker: what a container is, how it solves the "it worked on my machine" problem, packaging a .NET app with a Dockerfile and multi-stage build.
Deploying with CI/CD: Automating Test, Build and Deployment with GitHub Actions
We cover CI/CD: what continuous integration and continuous deployment mean, why an automated pipeline is needed, setting up a workflow with GitHub Actions, and automating test-build-deploy on every change.
Performance, Optimization and Closing the Series: Where to Go From Here?
We close the series: the basic principles of performance, the most common bottlenecks (like the N+1 query), not optimizing without measuring, a recap of what we learned, and where to go next.