Skip to content
EqualStack
Engineering

Modernising a .NET monolith without a big-bang rewrite

How to move a legacy .NET application to modern .NET and services step by step, keeping the business running the whole time.

[FOUNDER_2_NAME]Co-founder · Head of Enterprise Engineering2 min read

Most enterprise systems we meet share a story. A .NET Framework application started small, grew for ten years, and now carries the business. Deployments are scary, the build takes forever, and new engineers need months to become productive. Someone proposes a full rewrite.

Full rewrites usually fail, or take three times longer than planned, because the old system keeps changing while the new one chases it. There is a safer path.

Start with a map, not a plan

Spend the first two weeks understanding what you have:

  • Dependencies: which modules call which, and which share database tables.
  • Change hotspots: files that change most often in version control. These are where modernisation pays off first.
  • Pain points: slow pages, flaky jobs, incident history.

The output is a short list of candidate areas, ranked by business value and risk.

Upgrade the runtime first

Moving from .NET Framework to modern .NET brings better performance, cross-platform hosting and container support, often with modest code changes for business logic. The .NET Upgrade Assistant handles much of the mechanical work. Do this before extracting services, so new and old code share one runtime.

Where a full upgrade is blocked by old dependencies, multi-target shared libraries so they work in both worlds during the transition.

Use the strangler fig pattern

Put a routing layer, such as YARP or an API gateway, in front of the monolith. Then move one capability at a time:

  1. Build the new implementation behind the gateway.
  2. Route a small share of traffic to it, compare results, and fix differences.
  3. Switch fully and delete the old code path.

Users never see a cut-over weekend. Each step is small enough to roll back.

Untangle the database carefully

The shared database is usually the hardest part. Don't split it on day one. Instead:

  • Give each new service ownership of specific tables, even if they still live in the same database.
  • Replace cross-module joins with API calls or read models.
  • Publish events (we often use RabbitMQ) when data changes, so other modules stop polling shared tables.

Physical separation can come later, once ownership is clear.

Add safety nets as you go

Modernisation without tests is just moving risk around. For every area you touch:

  • Add characterisation tests that capture current behaviour, even if that behaviour is odd.
  • Add CI so every change is built and tested automatically.
  • Add structured logging and tracing, so you can compare old and new paths in production.

Measure the outcome

Agree success metrics before you begin: deployment frequency, lead time for changes, incident rate, page performance and onboarding time. Report them every month. It keeps the programme honest and makes the case for continued investment.

The result

Done this way, modernisation becomes a series of small, low-risk releases that each deliver value. After a year, the monolith is smaller, the critical paths run on modern .NET services, and the team ships with confidence again.

Planning a modernisation? Our web development team has moved .NET systems in FinTech, insurance and healthcare. Get in touch for a free architecture review call.

Written by

[FOUNDER_2_NAME]

Co-founder · Head of Enterprise Engineering

Full-stack engineer on .NET Core and React systems for FinTech, insurance, healthcare and US-government dashboards. Designs event-driven microservices that stay reliable under load.

Meet the team

Keep reading

Related articles

AI & ML3 min read

RAG in production: 7 lessons from shipping AI assistants

Retrieval-augmented generation is easy to demo and hard to run. Seven practical lessons on chunking, evaluation, access control and cost.

Working with us2 min read

Fixed price, time & material or dedicated team: how to choose

A practical guide to picking the right engagement model for your software project, with the trade-offs each one hides.

Have a project in mind?

Tell us what you're building. A senior engineer will reply within one business day with questions, ideas and next steps.