Cosmos.MultiTenancy
0.2.0
dotnet add package Cosmos.MultiTenancy --version 0.2.0
NuGet\Install-Package Cosmos.MultiTenancy -Version 0.2.0
<PackageReference Include="Cosmos.MultiTenancy" Version="0.2.0" />
<PackageVersion Include="Cosmos.MultiTenancy" Version="0.2.0" />
<PackageReference Include="Cosmos.MultiTenancy" />
paket add Cosmos.MultiTenancy --version 0.2.0
#r "nuget: Cosmos.MultiTenancy, 0.2.0"
#:package Cosmos.MultiTenancy@0.2.0
#addin nuget:?package=Cosmos.MultiTenancy&version=0.2.0
#tool nuget:?package=Cosmos.MultiTenancy&version=0.2.0
Cosmos.MultiTenancy
Contrato de resolución de tenants para aplicaciones distribuidas .NET 10 del ecosistema Cosmos.
Descripción
Este paquete provee únicamente la abstracción ITenantResolver. No incluye implementaciones concretas — éstas viven en paquetes separados según el origen del TenantId (HTTP headers, JWT claims, etc.):
Cosmos.MultiTenancy.AspNetCore—TrustedHeadersTenantResolverque lee el TenantId de un header HTTP confiable (defaultX-Tenant-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 ITenantResolver.
Contrato
namespace Cosmos.MultiTenancy;
public interface ITenantResolver
{
string TenantId { get; }
}
Una sola propiedad: el identificador del tenant del request o contexto actual.
Uso
El consumidor inyecta ITenantResolver y consulta TenantId:
public class OrderService(ITenantResolver tenantResolver, ICommandRouter commandRouter)
{
public Task CreateOrderAsync(CreateOrderCommand command, CancellationToken ct)
{
var tenantId = tenantResolver.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 header confiable (default X-Tenant-Id)
builder.Services.AgregarTenantResolverConHeadersConfiables();
// O con header configurable
builder.Services.AgregarTenantResolverConHeadersConfiables(options =>
{
options.TenantIdHeaderName = "X-Custom-Tenant";
});
Para escenarios sin HTTP (jobs, consoles, tests) hay que implementar ITenantResolver propio y registrarlo manualmente:
public class FixedTenantResolver(string tenantId) : ITenantResolver
{
public string TenantId { get; } = tenantId;
}
services.AddSingleton<ITenantResolver>(new FixedTenantResolver("dev-tenant"));
Integración con Wolverine
Cosmos.EventSourcing.CritterStack consume ITenantResolver en sus routers (WolverineCommandRouter, WolverineQueryRouter) para invocar Wolverine con el TenantId del request actual:
public class WolverineCommandRouter(IMessageBus messageBus, ITenantResolver tenantResolver)
: ICommandRouter
{
public Task InvokeAsync<TCommand>(TCommand command, CancellationToken ct) where TCommand : class
=> messageBus.InvokeForTenantAsync(tenantResolver.TenantId, command, ct);
}
El consumidor debe registrar una implementación de ITenantResolver 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
tenantResolver.TenantIdaIDocumentStore.OpenSession(tenantId).
Consideraciones de diseño
- Scope: se recomienda registrar como
Scopedpara web apps — un resolver 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.
- Resolver no encontrado: si
IServiceProviderno tieneITenantResolverregistrado, 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— resolver basado en headers HTTP confiables.Cosmos.EventSourcing.CritterStack— routers Wolverine que consumenITenantResolver.
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
ITenantResolver 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.