Cosmos.MultiTenancy 3.0.0

dotnet add package Cosmos.MultiTenancy --version 3.0.0
                    
NuGet\Install-Package Cosmos.MultiTenancy -Version 3.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Cosmos.MultiTenancy" Version="3.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Cosmos.MultiTenancy" Version="3.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Cosmos.MultiTenancy" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Cosmos.MultiTenancy --version 3.0.0
                    
#r "nuget: Cosmos.MultiTenancy, 3.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Cosmos.MultiTenancy@3.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Cosmos.MultiTenancy&version=3.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Cosmos.MultiTenancy&version=3.0.0
                    
Install as a Cake Tool

Cosmos.MultiTenancy

Contrato del contexto de tenancy para aplicaciones distribuidas .NET 10 del ecosistema Cosmos.

Descripción

Este paquete provee únicamente la abstracción ITenantContext. No incluye implementaciones concretas — éstas viven en paquetes separados según el origen de la identidad (HTTP headers, JWT claims, etc.):

  • Cosmos.MultiTenancy.AspNetCoreTrustedHeadersTenantContext que lee el TenantId del header HTTP confiable X-Tenant-Id, el UserId de X-User-Id y el OrganizationMembershipId de X-Organization-Membership-Id.

La separación entre contrato e implementación permite que las aplicaciones consuman el contrato sin depender de infraestructura concreta (HTTP, DB, JWT, etc.) y que los tests puedan registrar implementaciones in-memory.

Instalación

dotnet add package Cosmos.MultiTenancy

Se instala como dependencia transitiva al usar Cosmos.EventSourcing.CritterStack u otros paquetes del ecosistema que requieran ITenantContext.

Contrato

namespace Cosmos.MultiTenancy;

public interface ITenantContext
{
    string TenantId { get; }
    string UserId { get; }
    string OrganizationMembershipId { get; }
}

Tres propiedades del request o contexto actual: el identificador del tenant, el del usuario, y el de la membresía de ese usuario en la organización con la que está actuando.

Las tres son obligatorias: las implementaciones lanzan InvalidOperationException cuando el dato no está disponible, en vez de devolver null. Un flujo sin identidad completa es un error de configuración del borde, no un caso válido.

Headers de propagación

TenancyHeaders publica los nombres de los headers con los que la identidad viaja servicio-a-servicio en el envelope de Wolverine:

TenancyHeaders.UserId                    // "user_id"
TenancyHeaders.OrganizationMembershipId  // "organization_membership_id"

El TenantId no figura ahí porque Wolverine lo propaga de forma nativa (DeliveryOptions.TenantIdIMessageContext.TenantId).

Uso

El consumidor inyecta ITenantContext y consulta TenantId:

public class OrderService(ITenantContext tenantContext, ICommandRouter commandRouter)
{
    public Task CreateOrderAsync(CreateOrderCommand command, CancellationToken ct)
    {
        var tenantId = tenantContext.TenantId;
        // ...
        return commandRouter.InvokeAsync(command, ct);
    }
}

Registro en DI

El contrato no se registra automáticamente. El consumidor elige qué implementación usar:

// Para servicios ASP.NET Core con headers confiables emitidos por el gateway
builder.Services.AgregarTenantContextConHeadersConfiables();

Para escenarios sin HTTP (jobs, consoles, tests) hay que implementar ITenantContext propio y registrarlo manualmente:

public class FixedTenantContext(string tenantId, string userId, string organizationMembershipId)
    : ITenantContext
{
    public string TenantId { get; } = tenantId;
    public string UserId { get; } = userId;
    public string OrganizationMembershipId { get; } = organizationMembershipId;
}

services.AddSingleton<ITenantContext>(
    new FixedTenantContext("dev-tenant", "dev-user", "dev-membership"));

Integración con Wolverine

Cosmos.EventSourcing.CritterStack consume ITenantContext en sus routers (WolverineCommandRouter, WolverineQueryRouter) para invocar Wolverine con el TenantId del request actual:

public class WolverineCommandRouter(IMessageBus messageBus, ITenantContext tenantContext)
    : ICommandRouter
{
    public Task InvokeAsync<TCommand>(TCommand command, CancellationToken ct) where TCommand : class
        => messageBus.InvokeForTenantAsync(tenantContext.TenantId, command, ct);
}

El consumidor debe registrar una implementación de ITenantContext antes de usar los routers — sin eso, la resolución de DI fallará en runtime.

Casos de uso

  • Multi-tenancy en event sourcing: prefijar IDs de agregado con el TenantId para aislar streams.
  • Logging con contexto: enriquecer logs con el TenantId del request actual.
  • Marten multi-tenant: pasar tenantContext.TenantId a IDocumentStore.OpenSession(tenantId).

Consideraciones de diseño

  • Scope: se recomienda registrar como Scoped para web apps — un contexto por request.
  • Aislamiento de datos: este paquete identifica el tenant; el aislamiento real (DB-per-tenant, schema-per-tenant, columna discriminator) lo implementan capas superiores.
  • Contexto no encontrado: si IServiceProvider no tiene ITenantContext registrado, los routers de CritterStack fallarán con InvalidOperationException al inyectar la dependencia.

Requisitos

  • .NET 10.0 o superior

Dependencias

Sin dependencias externas.

Paquetes relacionados

Licencia

Copyright © Cosmos. Todos los derechos reservados.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on Cosmos.MultiTenancy:

Package Downloads
Cosmos.EventSourcing.CritterStack

Implementaciones de Wolverine y Marten para EDA y event sourcing

Cosmos.EventDriven.CritterStack

Implementaciones de Wolverine para IPublicEventSender e IPrivateEventSender en Cosmos EDA

Cosmos.MultiTenancy.AspNetCore

ITenantContext basado en headers HTTP confiables para servicios ASP.NET Core en Cosmos.

Cosmos.CrossCuttingConcerns.TenantPreferences.Flagsmith

Implementación Flagsmith para Cosmos.CrossCuttingConcerns.TenantPreferences.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.0.0 104 8/13/2026
2.3.1 551 7/22/2026
2.3.0 547 7/21/2026
2.2.0 204 7/21/2026
2.1.0 354 7/17/2026
2.0.0 216 7/15/2026
1.3.0 578 7/9/2026
1.2.6 265 7/3/2026
1.2.5 352 7/1/2026
1.2.4 409 7/1/2026
1.2.3 413 6/18/2026
1.2.2 615 6/12/2026
1.2.1 193 6/12/2026
1.2.0 197 6/11/2026
1.1.0 493 6/3/2026
1.0.0 285 6/2/2026
0.3.0 300 5/28/2026
0.2.0 891 5/21/2026
0.1.1 256 5/20/2026
0.1.0 124 5/20/2026