Skip to main content

ADR-002: Hybrid Strangler Fig Strategy

Status: Proposed
Date: 2026-01-20
Context: Legacy Migration Approach


Decision

We adopt a Hybrid Strangler Fig strategy: a side-by-side .NET 8 API running alongside the legacy .NET Framework 4.8 monolith.

Context

  • The legacy monolith cannot be "big bang" rewritten (high failure rate, business logic loss).
  • The Data Layer (EITWEP.Model) uses Entity Framework 6.4.4 compatible with .NET Standard 2.1.
  • The organization wants to move to .NET 8 (LTS) for performance and longevity.

Considered Options

Option A: In-Place Upgrade

  • Pros: Single codebase.
  • Cons: .NET Framework 4.8 → .NET 8 requires removing System.Web, which is deeply embedded.

Option B: Big Bang Rewrite

  • Pros: Clean slate.
  • Cons: 75% failure rate for rewrites. Lost domain knowledge. Feature freeze for 12+ months.

Option C: Hybrid Strangler Fig

  • Pros:
    • New features in .NET 8 immediately.
    • Zero feature freeze.
    • Shared Data Layer enables coexistence.
  • Cons: Temporary complexity of two apps (SSO, Routing).

Rationale

The Strangler Fig pattern allows incremental replacement. By targeting the Data Layer (EF 6.4.4 → .NET Standard), we create a bridge between old and new.

┌─────────────────────────────────────────────────┐
│ Reverse Proxy │
│ (IIS ARR / YARP / nginx) │
└───────────────────┬─────────────────────────────┘

┌─────────────┴─────────────┐
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Legacy App │ │ Modern API │
│ (.NET 4.8) │ │ (.NET 8) │
│ IIS/Windows │ │ Kestrel │
└──────┬──────┘ └──────┬──────┘
│ │
└─────────┬───────────────┘

┌─────────────────┐
│ Shared Data │
│ (EITWEP.Model) │
│ .NET Standard │
└─────────────────┘

Consequences

  1. Routing Layer: Implement reverse proxy (YARP or ARR) to route traffic.
  2. Shared Authentication: Use JWT/OIDC for stateless SSO between apps.
  3. Deployment: Both apps can deploy independently.
  4. Gradual Migration: New endpoints → Modern API. Legacy endpoints stay until fully replaced.

References