.NET Development

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

AutoMapper, MediatR, MassTransit, FluentAssertions - viele etablierte .NET Bibliotheken werden kommerziell. Was bedeutet das für Ihre Architektur? Wie schützen Sie sich vor Vendor Lock-in? Strategien für resiliente .NET Anwendungen.

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

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

Am 2. April 2025 erschütterte eine Ankündigung die .NET Community: AutoMapper, MediatR und MassTransit - drei der meistgenutzten Open-Source-Bibliotheken - werden kommerziell. Kein Aprilscherz, sondern der Höhepunkt eines Trends, der sich seit 2021 abzeichnet.

Als CTO und Architekt mit 15+ Jahren .NET-Erfahrung habe ich diese Entwicklung kommen sehen - und dennoch trifft sie die Community hart. AutoMapper allein hat über 795 Millionen Downloads. Millionen von Produktivanwendungen nutzen diese Bibliotheken täglich.

In diesem Artikel:

  • Die Timeline der Kommerzialisierungen (2021-2025)
  • Was diese Entwicklung für das .NET Ökosystem bedeutet
  • Konkrete Architektur-Strategien gegen Vendor Lock-in
  • Handlungsempfehlungen für CTOs und Architekten

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 persönlicher Ratschlag

Nach 15+ Jahren als .NET Entwickler und CTO habe ich eines gelernt: Jede externe Dependency ist eine langfristige Beziehung.

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

Diese Entwicklung ist nicht nur negativ:

  1. Nachhaltigeres Ökosystem: Maintainer können von ihrer Arbeit leben
  2. Bessere Qualität: Bezahlte Maintainer → mehr Zeit für Quality
  3. Enterprise Support: SLAs, Priority Fixes, Dedicated Support
  4. Innovation: Funding ermöglicht größere Features

Jimmy Bogard hat 14 Jahre lang kostenlos gearbeitet. Ich respektiere seine Entscheidung, AutoMapper und MediatR nachhaltig zu machen.

Aber als Architekt müssen wir pragmatisch sein: Was heute kostenlos ist, kann morgen kommerziell werden.

Fazit: Abstraktion ist Ihre Versicherung

Die Kommerzialisierung von .NET Bibliotheken ist nicht aufzuhalten - und das ist okay. Open Source war nie eine Garantie für "kostenlos für immer".

Die Lehre daraus:

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);
}

Meine Kernempfehlung:

  1. Abstrahieren Sie kritische Dependencies (AutoMapper, MediatR, MassTransit)
  2. Evaluieren Sie Alternativen proaktiv (Mapster, Wolverine, eigene Lösungen)
  3. Dokumentieren Sie Exit-Strategien (Migration-Playbooks)
  4. Budgetieren Sie für Commercial Licenses (oder planen Sie Migrationen)
  5. Tragen Sie zu Open Source bei (wenn Sie profitieren, geben Sie zurück)

Die .NET Community ist stark - aber nur, wenn wir nachhaltig denken.


Haben Sie AutoMapper oder MediatR im Einsatz? Wie gehen Sie mit der Kommerzialisierung um? Ich freue mich auf Ihre Perspektive - als Board-Advisor und Fractional CTO berate ich regelmäßig zu diesen Architektur-Entscheidungen.

Kontaktieren Sie mich für eine kostenlose Erstberatung zu Ihrer Dependency-Strategie.

← Zurück zu allen Publikationen