Cosmos.MultiTenancy
3.0.0
dotnet add package Cosmos.MultiTenancy --version 3.0.0
NuGet\Install-Package Cosmos.MultiTenancy -Version 3.0.0
<PackageReference Include="Cosmos.MultiTenancy" Version="3.0.0" />
<PackageVersion Include="Cosmos.MultiTenancy" Version="3.0.0" />
<PackageReference Include="Cosmos.MultiTenancy" />
paket add Cosmos.MultiTenancy --version 3.0.0
#r "nuget: Cosmos.MultiTenancy, 3.0.0"
#:package Cosmos.MultiTenancy@3.0.0
#addin nuget:?package=Cosmos.MultiTenancy&version=3.0.0
#tool nuget:?package=Cosmos.MultiTenancy&version=3.0.0
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.AspNetCore—TrustedHeadersTenantContextque lee el TenantId del header HTTP confiableX-Tenant-Id, el UserId deX-User-Idy el OrganizationMembershipId deX-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.TenantId → IMessageContext.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.TenantIdaIDocumentStore.OpenSession(tenantId).
Consideraciones de diseño
- Scope: se recomienda registrar como
Scopedpara 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
IServiceProviderno tieneITenantContextregistrado, los routers de CritterStack fallarán conInvalidOperationExceptional inyectar la dependencia.
Requisitos
- .NET 10.0 o superior
Dependencias
Sin dependencias externas.
Paquetes relacionados
Cosmos.MultiTenancy.AspNetCore— contexto basado en headers HTTP confiables.Cosmos.EventSourcing.CritterStack— routers Wolverine que consumenITenantContext.
Licencia
Copyright © Cosmos. Todos los derechos reservados.
| Product | Versions 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. |
-
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 |