Enterprise Architektur

Die Kommerzialisierung des .NET Ökosystems: AutoMapper, MediatR & Co. werden kostenpflichtig

AutoMapper, MediatR, MassTransit, FluentAssertions werden kommerziell. Was heißt das für Ihre Architektur, Ihre Budgets und Ihre Exit-Strategien? Konkrete Maßnahmen für CTOs und Architekten, die Vendor-Lock-in vermeiden wollen.

📖 16 Min. Lesezeit
Open Source .NET AutoMapper MediatR Vendor Lock-in Architektur NuGet Kommerzialisierung Dependency-Management

Die Kommerzialisierung des .NET Ökosystems: Was Architekten jetzt wissen müssen

Am 2. Juli 2025 kam die Ankündigung: AutoMapper, MediatR und MassTransit werden kommerziell. Drei Bibliotheken, die in quasi jeder Enterprise-.NET-Codebase stecken. Kein Einzelfall, sondern das bisherige Maximum eines Trends seit 2021.

AutoMapper allein hat über 795 Millionen Downloads. Wenn Sie ein .NET-Portfolio verantworten, sitzen diese Abhängigkeiten jetzt auf Ihrer Risiko-Liste — egal, ob Sie sie gewählt haben oder sie "irgendwie reingekommen" sind.

Für wen dieser Artikel relevant ist: CTOs, Software-Architekten und Engineering-Leads, die ihr .NET-Portfolio auf Lizenz-Risiken prüfen, Budgets für 2026+ planen oder Exit-Strategien für kritische Dependencies brauchen.

In diesem Artikel:

  • Die Timeline der Kommerzialisierungen (2021-2025)
  • Was der Trend für Ihr Portfolio bedeutet
  • Konkrete Architektur-Maßnahmen gegen Vendor-Lock-in
  • Handlungsempfehlungen nach Zeithorizont

Die Timeline: Vom kostenlosen Open Source zum Subscription-Modell

2021: IdentityServer → Duende Software

Der Anfang: IdentityServer, die de-facto Standard-Bibliothek für OAuth/OIDC in .NET, wurde mit Version 5 kommerziell.

// IdentityServer4 (kostenlos, aber veraltet)
services.AddIdentityServer()
    .AddInMemoryClients(Config.Clients)
    .AddInMemoryApiScopes(Config.ApiScopes);

// Duende IdentityServer (kommerziell ab v5+)
// Gleiche API, andere Lizenz

Lizenzmodell:

  • Kostenlos für Dev/Testing
  • Kommerziell ab $1,500/Jahr (bis 15 User)
  • Enterprise ab $6,500/Jahr

Community-Reaktion: IdentityServer4 wird weiter als Open Source gepflegt, aber ohne neue Features.

2022-2023: Die Welle beginnt

ImageSharp (SixLabors)

Split-License-Modell:

  • Apache 2.0 für Open-Source-Projekte
  • Kommerziell für Closed-Source-Produkte ab $1,000/Jahr
// ImageSharp - gleicher Code, unterschiedliche Lizenz
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

var image = Image.Load("photo.jpg");
image.Mutate(x => x.Resize(800, 600));
image.Save("thumbnail.jpg");

QuestPDF

Harter Cut:

  • Version 2022.12.X: MIT License (kostenlos)
  • Version 2023.4.X: Commercial License
  • Community License: Free für <$1M Revenue
// QuestPDF - PDF-Generierung
Document.Create(container =>
{
    container.Page(page =>
    {
        page.Content().Text("Hello World");
    });
}).GeneratePdf("hello.pdf");

FluentAssertions

Die kontroverseste Änderung:

  • Version 7.X: Apache 2.0 (kostenlos)
  • Version 8.0: Kommerziell (ohne klare Ankündigung)
  • Community-Backlash: Viele Entwickler fühlten sich überrumpelt
// FluentAssertions - Testing
result.Should().NotBeNull();
result.Should().BeOfType<Customer>();
result.Name.Should().Be("Alex Bierhaus");

2025: Der große Knall

AutoMapper (Jimmy Bogard / Lucky Penny Software)

Die Ankündigung, die alles änderte:

Am 2. Juli 2025 gingen AutoMapper und MediatR unter dem Dach von "Lucky Penny Software" kommerziell.

Zahlen:

  • AutoMapper: 794,7 Millionen Downloads
  • MediatR: 286,6 Millionen Downloads
  • Geschätzte Nutzung: 70-80% aller Enterprise-.NET-Anwendungen

Lizenzmodell:

Dual-License:
├── Community Edition (kostenlos)
│   ├── Revenue < $5M/Jahr
│   ├── Non-Profits < $5M Budget
│   └── Funding < $10M (Lifetime)
└── Commercial Edition (Subscription)
    ├── Team-basiert (nicht per Seat)
    ├── Monatlich/Jährlich
    └── Bundle-Rabatte verfügbar

Code-Beispiel:

// AutoMapper v15+ - gleiche API, neue Lizenz
public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<CustomerDto, Customer>();
        CreateMap<Customer, CustomerViewModel>()
            .ForMember(d => d.FullName,
                opt => opt.MapFrom(s => $"{s.FirstName} {s.LastName}"));
    }
}

// MediatR v13+ - gleiche API, neue Lizenz
public record CreateCustomerCommand(string Name) : IRequest<int>;

public class CreateCustomerHandler
    : IRequestHandler<CreateCustomerCommand, int>
{
    public async Task<int> Handle(
        CreateCustomerCommand request,
        CancellationToken cancellationToken)
    {
        // ...
        return customerId;
    }
}

Was bleibt kostenlos:

  • Alle Versionen < v15 (AutoMapper) / < v13 (MediatR)
  • Archive-Repository mit Legacy-Versionen
  • Keine Rückwirkende Lizenzänderung

MassTransit v9

Klare Versionsführung:

  • v8.X: Open Source (Support bis 2026)
  • v9.X: Commercial License
// MassTransit v8 (Open Source)
services.AddMassTransit(x =>
{
    x.AddConsumer<OrderCreatedConsumer>();

    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("rabbitmq://localhost");
        cfg.ConfigureEndpoints(context);
    });
});

Lizenz:

  • Community License: Free < $1M Revenue
  • Commercial: $500/Developer/Jahr (jährlich)

Warum passiert das? Die Ökonomie von Open Source

Die Fakten

2024 Open Source Funding Survey (Linux Foundation + GitHub + Harvard):

  • 60% der Maintainer sind unbezahlt
  • Durchschnittlicher Zeitaufwand: 10-20 Stunden/Woche
  • Burnout-Rate: 73% fühlen sich überarbeitet
  • Erwartete Kompensation: $2,000+/Monat für Full-Time-Arbeit

Beispiel AutoMapper:

Downloads/Monat: ~20 Millionen
Support-Anfragen/Monat: ~500 Issues/Discussions
Geschätzter Wartungsaufwand: 40+ Stunden/Woche

Bisherige Kompensation: $0

Die Nachhaltigkeitskrise

Open Source Nachhaltigkeitsgleichung:

  (Nutzung × Erwartungen) - Finanzierung = Burnout

  AutoMapper Beispiel:
  (794M Downloads × "Funktioniert immer") - $0 = Nicht nachhaltig

Jimmy Bogard (AutoMapper/MediatR Creator):

"Nach 14 Jahren unbezahlter Arbeit an Bibliotheken, die Millionen von Entwicklern produktiver machen, muss ich eine Entscheidung treffen: Entweder Archive oder Kommerzialisierung. Ich habe mich für Nachhaltigkeit entschieden."

Die Paradoxie

// Entwickler-Reaktion auf Open-Source-Bibliotheken:

if (library.IsFree && library.IsPopular)
{
    // Erwartung: Enterprise-Grade-Support
    // Realität: Maintainer arbeitet nachts an Issues

    expectations.ShouldBe(EnterpriseSupport.AllTime);
    compensation.ShouldBe(0); // ???
}

Meine Einschätzung: Was das für .NET bedeutet

1. Der Trend ist irreversibel

Diese Entwicklung wird sich fortsetzen:

Kandidaten für Kommerzialisierung in 2025-2026:

High Risk:
├── Serilog (Logging) - 500M+ Downloads
├── Dapper (Micro-ORM) - 400M+ Downloads
├── Hangfire (Background Jobs) - 100M+ Downloads (bereits Pro-Version)
└── NLog (Logging) - 300M+ Downloads

Medium Risk:
├── Refit (HTTP Client) - 150M+ Downloads
├── FluentValidation (Validation) - 200M+ Downloads
└── Bogus (Test Data) - 80M+ Downloads

Low Risk (Corporate-Backed):
├── Polly (Resilience) - .NET Foundation
├── ASP.NET Core (Microsoft)
└── Entity Framework Core (Microsoft)

2. Dual-License wird Standard

Das neue Open-Source-Modell:

┌─────────────────────────────────────┐
│ Open Source Library v2.0            │
├─────────────────────────────────────┤
│                                     │
│ ┌─────────────────────────────┐   │
│ │ Community Edition           │   │
│ │ - Free für <$5M Revenue     │   │
│ │ - Community Support         │   │
│ │ - Delayed Features (3-6M)   │   │
│ └─────────────────────────────┘   │
│                                     │
│ ┌─────────────────────────────┐   │
│ │ Commercial Edition          │   │
│ │ - $500-2000/Dev/Jahr        │   │
│ │ - Priority Support          │   │
│ │ - Early Access Features     │   │
│ │ - SLA Garantien             │   │
│ └─────────────────────────────┘   │
│                                     │
└─────────────────────────────────────┘

3. Microsoft wird mehr tun müssen

Die .NET Foundation allein reicht nicht:

// Was .NET Foundation bietet:
var netFoundation = new List<string>
{
    "Legal Protection",
    "Governance",
    "Community Guidance"
};

// Was .NET Foundation NICHT bietet:
var missing = new List<string>
{
    "Developer Funding",
    "Maintainer Salaries",
    "Infrastructure Costs"
};

Meine Idee: Microsoft sollte ein "Essential .NET Libraries Program" starten - $20M/Jahr für kritische Infrastruktur-Bibliotheken.

4. Architektur-Entscheidungen werden wichtiger

Die neue Realität:

// Früher: "Best Library gewinnt"
services.AddAutoMapper(typeof(Startup));
services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(assembly));

// Jetzt: "Total Cost of Ownership"
var decision = new ArchitectureDecision
{
    TechnicalFit = 9/10,        // AutoMapper ist perfekt
    LicenseCost = $5000/Jahr,   // 10 Entwickler
    MigrationRisk = "High",     // Überall im Code
    LockInRisk = "Very High",   // Abstractions fehlen

    // → Muss gegen Alternativen abgewogen werden
};

Handlungsempfehlungen: So schützen Sie Ihre Architektur

1. Abstraktion über externe Dependencies

Das Anti-Corruption-Layer-Prinzip:

// ❌ FALSCH: Direkte Abhängigkeit
public class CustomerService
{
    private readonly IMapper _mapper; // AutoMapper direkt!

    public CustomerViewModel GetCustomer(int id)
    {
        var customer = _repository.GetById(id);
        return _mapper.Map<CustomerViewModel>(customer); // Lock-in!
    }
}

// ✅ RICHTIG: Eigene Abstraktion
public interface IObjectMapper
{
    TDestination Map<TSource, TDestination>(TSource source);
}

// AutoMapper-Adapter (austauschbar)
public class AutoMapperAdapter : IObjectMapper
{
    private readonly IMapper _mapper;

    public AutoMapperAdapter(IMapper mapper)
    {
        _mapper = mapper;
    }

    public TDestination Map<TSource, TDestination>(TSource source)
    {
        return _mapper.Map<TDestination>(source);
    }
}

// Registration
services.AddSingleton<IObjectMapper, AutoMapperAdapter>();

// Verwendung
public class CustomerService
{
    private readonly IObjectMapper _mapper; // Eigene Abstraktion!

    public CustomerViewModel GetCustomer(int id)
    {
        var customer = _repository.GetById(id);
        return _mapper.Map<Customer, CustomerViewModel>(customer);
    }
}

Vorteil: AutoMapper kann in 2 Tagen gegen Mapster oder eigenen Code ersetzt werden.

2. MediatR-Alternativen evaluieren

Die MediatR-Falle:

// MediatR ist überall:
public class CreateOrderController : ControllerBase
{
    private readonly IMediator _mediator; // MediatR

    [HttpPost]
    public async Task<IActionResult> Create(CreateOrderRequest request)
    {
        var command = new CreateOrderCommand(request.CustomerId);
        var result = await _mediator.Send(command); // MediatR
        return Ok(result);
    }
}

// MediatR in Services, Handlers, Events...
// → Migration = Monate, nicht Tage

Alternative 1: Wolverine (kostenlos, performanter)

// Wolverine - Open Source Alternative
public class CreateOrderEndpoint
{
    // Wolverine nutzt Roslyn Source Generators
    [WolverinePost("/api/orders")]
    public async Task<OrderCreated> Create(
        CreateOrderCommand command,
        IOrderRepository repository)
    {
        var order = new Order(command.CustomerId);
        await repository.Add(order);

        return new OrderCreated(order.Id);
    }
}

// Keine IMediator-Dependency, gleiche Funktionalität

Alternative 2: Eigenes Command-Pattern

public interface ICommandHandler<TCommand, TResult>
{
    Task<TResult> Handle(TCommand command, CancellationToken ct);
}

public class CommandDispatcher
{
    private readonly IServiceProvider _serviceProvider;

    public async Task<TResult> Send<TResult>(
        ICommand<TResult> command,
        CancellationToken ct = default)
    {
        var handlerType = typeof(ICommandHandler<,>)
            .MakeGenericType(command.GetType(), typeof(TResult));

        var handler = _serviceProvider.GetRequiredService(handlerType);
        var method = handlerType.GetMethod("Handle");

        return (TResult)await (Task<TResult>)method
            .Invoke(handler, new object[] { command, ct });
    }
}

// 50 Zeilen Code, keine externe Dependency

3. Mapping-Strategien überdenken

Die Wahrheit über Object-Mapping:

// Frage: Brauchen Sie wirklich AutoMapper?

// Szenario 1: Triviales Mapping
public class CustomerDto
{
    public string Name { get; set; }
    public string Email { get; set; }
}

// AutoMapper:
CreateMap<Customer, CustomerDto>(); // Reflection, Runtime-Overhead

// Alternative: Source Generators
[MapTo(typeof(CustomerDto))]
public partial class Customer
{
    public string Name { get; set; }
    public string Email { get; set; }

    // Compiler generiert Mapping-Code zur Build-Time
}

// Oder einfach:
public CustomerDto ToDto() => new()
{
    Name = this.Name,
    Email = this.Email
};

Mapster: Die kostenlose Alternative

// Mapster - Open Source, performanter als AutoMapper
services.AddMapster();

// Gleiche Funktionalität, keine Lizenzkosten
var dto = customer.Adapt<CustomerDto>();

// Custom Mapping
TypeAdapterConfig<Customer, CustomerDto>
    .NewConfig()
    .Map(dest => dest.FullName,
         src => $"{src.FirstName} {src.LastName}");

Performance-Vergleich:

Object Mapping Performance (10.000 Mappings):

Manual Mapping:        1.2ms   ████
Mapster:              2.8ms   █████████
AutoMapper:           8.5ms   ███████████████████████████

4. Dependency-Audit durchführen

Erstellen Sie eine "License Risk Matrix":

// PowerShell-Script für NuGet-Audit
dotnet list package --include-transitive |
    Where-Object { $_ -match "AutoMapper|MediatR|MassTransit" } |
    ForEach-Object {
        Write-Host "⚠️ Commercial Risk: $_" -ForegroundColor Yellow
    }

Meine empfohlene Matrix:

Package Downloads License Risk Ersetzbarkeit Action
AutoMapper 794M Commercial 🔴 High ⚠️ Medium Abstrahieren
MediatR 286M Commercial 🔴 High ⚠️ Medium Wolverine evaluieren
MassTransit v9 50M Commercial 🟡 Medium ✅ High v8 behalten
Serilog 500M Apache 2.0 🟢 Low ✅ High Beobachten
Dapper 400M Apache 2.0 🟢 Low ✅ High Beobachten
Polly 200M BSD-3 🟢 Low ⚠️ Medium OK (.NET Foundation)

5. Architektur-Patterns für Resilience

Das Strangler-Fig-Pattern für Dependencies:

// Phase 1: Abstraktion einführen (Week 1-2)
public interface IObjectMapper { }
public interface IMessageBus { }

// Phase 2: Adapter für bestehende Library (Week 3-4)
public class AutoMapperAdapter : IObjectMapper { }
public class MediatRAdapter : IMessageBus { }

// Phase 3: Alternative implementieren (Week 5-8)
public class MapsterAdapter : IObjectMapper { }
public class WolverineAdapter : IMessageBus { }

// Phase 4: Feature-Toggle für schrittweise Migration (Week 9-12)
services.AddSingleton<IObjectMapper>(sp =>
{
    var config = sp.GetRequiredService<IConfiguration>();
    var useNewMapper = config.GetValue<bool>("FeatureFlags:UseMapster");

    return useNewMapper
        ? new MapsterAdapter()
        : new AutoMapperAdapter(sp.GetRequiredService<IMapper>());
});

// Phase 5: Alte Library entfernen (Week 13+)
services.AddSingleton<IObjectMapper, MapsterAdapter>();

6. "Build vs. Buy"-Analyse neu bewerten

Die neue Kosten-Gleichung:

public class DependencyDecision
{
    public decimal AnnualLicenseCost { get; set; }
    public int DevelopersUsingIt { get; set; }
    public TimeSpan ImplementationTime { get; set; }
    public decimal DeveloperHourlyRate { get; set; }
    public decimal MigrationRisk { get; set; }

    public decimal TotalCostOfOwnership()
    {
        var licenseCost = AnnualLicenseCost * 3; // 3-Jahr-Horizont
        var implementationCost = ImplementationTime.TotalHours
                                * DeveloperHourlyRate;
        var riskCost = MigrationRisk; // Schwer zu quantifizieren

        return licenseCost + implementationCost + riskCost;
    }
}

// Beispiel AutoMapper:
var autoMapperDecision = new DependencyDecision
{
    AnnualLicenseCost = 5000,          // 10 Devs × $500
    DevelopersUsingIt = 10,
    ImplementationTime = TimeSpan.Zero, // Bereits implementiert
    MigrationRisk = 25000               // Risiko-Puffer
};

var mapsterDecision = new DependencyDecision
{
    AnnualLicenseCost = 0,              // Open Source
    DevelopersUsingIt = 10,
    ImplementationTime = TimeSpan.FromHours(80), // 2 Wochen Migration
    DeveloperHourlyRate = 75,
    MigrationRisk = 10000               // Geringeres Risiko
};

// AutoMapper TCO: $30,000 (3 Jahre)
// Mapster TCO:    $16,000 (einmalig)

7. Community Edition nutzen (wenn möglich)

Prüfen Sie die Eligibility:

// AutoMapper/MediatR Community License Requirements:

var isEligible = new CommunityLicenseCheck
{
    AnnualRevenue = 4_500_000,          // < $5M ✅
    TotalFunding = 0,                    // < $10M ✅
    IsNonProfit = false,
    IsEducational = false
};

if (isEligible.AnnualRevenue < 5_000_000 &&
    isEligible.TotalFunding < 10_000_000)
{
    // Sie können Community Edition nutzen!
    // Aber: Planen Sie für Wachstum
}

Wichtig: Selbst wenn Sie heute eligible sind - was in 2 Jahren?

Konkrete Action Items für CTOs und Architekten

Sofort (diese Woche):

var immediateActions = new List<string>
{
    "Dependency-Audit durchführen (alle kommerziellen Libraries)",
    "License-Kosten für nächste 3 Jahre hochrechnen",
    "Community License Eligibility prüfen",
    "Architecture Decision Records (ADR) für kritische Dependencies"
};

Kurzfristig (nächste 3 Monate):

var shortTermActions = new List<string>
{
    "Abstractions für AutoMapper/MediatR einführen",
    "PoC mit Alternativen (Mapster, Wolverine)",
    "Migration-Strategie dokumentieren",
    "Team-Training: Vendor-Lock-in-Awareness"
};

Mittelfristig (6-12 Monate):

var mediumTermActions = new List<string>
{
    "Schrittweise Migration kritischer Dependencies",
    "Eigene Mapping/Messaging-Abstractions produktiv nutzen",
    "Monitoring: Dependency-Update-Zyklen",
    "Regelmäßige License-Audits etablieren"
};

Langfristig (1-3 Jahre):

var longTermActions = new List<string>
{
    "Zero-Commercial-Dependency-Strategie (wo sinnvoll)",
    "Beitritt zu .NET Foundation / Open Source Funding",
    "Eigene Open-Source-Contributions (give back)",
    "Architektur-Patterns für Dependency-Resilience"
};

Mein Ratschlag aus 15+ Jahren .NET

Eines habe ich gelernt: Jede externe Dependency ist eine langfristige Beziehung — behandeln Sie sie wie eine Vendor-Wahl.

Behandeln Sie Bibliotheken wie Vendor-Auswahl:

// Früher:
if (library.HasGoodDocs && library.IsPopular)
{
    Install-Package library
}

// Jetzt:
var decision = new VendorEvaluation
{
    TechnicalFit = EvaluateFit(library),
    LicenseModel = AnalyzeLicense(library),
    Maintainability = CheckMaintainer(library),
    ExitStrategy = PlanMigration(library),
    TotalCost = CalculateTCO(library, years: 3)
};

if (decision.Score > threshold)
{
    InstallWithAbstraction(library);
    DocumentExitStrategy(library);
}

Die positive Seite

Die Entwicklung hat gute Gründe:

  1. Nachhaltigeres Ökosystem: Maintainer können von ihrer Arbeit leben
  2. Bessere Qualität: Bezahlte Maintainer investieren mehr in Tests, Reviews, Dokumentation
  3. Enterprise Support: SLAs, Priority Fixes, Dedicated Support werden realistisch
  4. Innovation: Funding ermöglicht größere Features

Jimmy Bogard hat 14 Jahre unbezahlt gearbeitet. Seine Entscheidung, AutoMapper und MediatR nachhaltig zu machen, ist respektabel.

Für Sie als Architekt zählt die pragmatische Folge: Was heute kostenlos ist, kann morgen kommerziell werden. Planen Sie entsprechend.

Fazit: Abstraktion ist Ihre Versicherung

Die Kommerzialisierung wird sich fortsetzen — und das ist legitim. Open Source war nie eine Garantie für "kostenlos für immer". Ihre Aufgabe als Architekt: das Portfolio so bauen, dass Lizenzänderungen kein Panik-Projekt auslösen.

Die Konsequenzen für Ihre Architektur:

public class ArchitecturePrinciples
{
    // Prinzip 1: Abstraktion über Konkretion
    public IMapper Mapper { get; set; }  // Nicht: AutoMapper.IMapper

    // Prinzip 2: Dependency-Inversion
    public IMessaging Bus { get; set; }  // Nicht: IMediator

    // Prinzip 3: Exit-Strategy
    public IMigrationPlan ExitPlan { get; set; }

    // Prinzip 4: Total Cost of Ownership
    public decimal TCO => CalculateTCO(years: 3);
}

Kernempfehlungen — in dieser Reihenfolge:

  1. Auditieren Sie Ihr Portfolio diese Woche. Sie können nicht steuern, was Sie nicht kennen.
  2. Abstrahieren Sie kritische Dependencies (AutoMapper, MediatR, MassTransit).
  3. Evaluieren Sie Alternativen proaktiv (Mapster, Wolverine, eigene Lösungen).
  4. Dokumentieren Sie Exit-Strategien für jede kritische Dependency.
  5. Budgetieren Sie früh — für Lizenzen oder Migration.
  6. Geben Sie zurück — Sponsoring, Contributions, oder beides.

Die .NET Community bleibt stark, wenn wir Nachhaltigkeit ernst nehmen — auf Maintainer-Seite wie auf Unternehmer-Seite.

Nächste Schritte

← Zurück zu allen Publikationen