Persisting a Rich Domain Model With EF Core
Learn how to persist a rich domain model with EF Core, overcoming common ORM limitations for full encapsulation and invariants.
Milan Jovanović — Software Architect and Microsoft MVP for Developer Technologies, helping engineers master .NET and software architecture through practical guidance, newsletters, and videos based on real-world enterprise experience.
40 articles from this blog
Learn how to persist a rich domain model with EF Core, overcoming common ORM limitations for full encapsulation and invariants.
A guide to deciding whether to split a monolith into microservices, featuring five key questions to evaluate before making the transition.
Akamai launched Edge Case: a free Discord community for developers building with AI/LLMs, serverless, cloud infrastructure, and WebAssembly. Inside yo
A technical guide on migrating a static website from Netlify to Cloudflare Pages, saving $228/year with zero downtime.
A guide on testing vertical slice architecture using integration tests with WebApplicationFactory and Testcontainers.
Guide to building a private network using Tailscale VPN, focusing on secure, zero-open-port connections between servers.
Guide to using NATS JetStream as a durable message queue in .NET applications, including setup and client integration.
A technical article about the pitfalls of modular monolith design, focusing on how a clean separation between modules can become irreversible over time.
Tutorial on building durable Dapr Workflows in .NET with Aspire, covering orchestration, activities, and state management.
Explores the common misunderstanding of the DRY principle in programming, emphasizing knowledge over code duplication.
C# 15 introduces union types, allowing developers to model values that can be one of several types with compile-time safety.
Guide to scaling long-running API requests using async patterns, job queues, and worker pools to improve availability.
Designing .NET applications to handle partial failures in use cases involving multiple systems, with strategies for recovery.
Explains why API versioning should be a last resort, focusing on change management and compatibility rules to evolve APIs without breaking clients.
Explains invariants in domain models and why enforcing them on the model itself is better than scattering rules across handlers.
Challenges the traditional test pyramid, advocating for more integration tests over unit tests using modern tools like Testcontainers.
A C# developer explains why they switched to primary constructors for dependency injection, highlighting boilerplate reduction and a key pitfall.
A technical guide on implementing the Saga pattern in .NET using Wolverine, covering setup, message routing, and saga state persistence.
Explains the Inbox pattern for reliable message consumption, preventing duplicate processing in distributed systems.
Guide to using pgvector in .NET for vector search with PostgreSQL, embeddings, and semantic similarity queries.