Cosmos.MultiTenancy 0.2.0

dotnet add package Cosmos.MultiTenancy --version 0.2.0
                    
NuGet\Install-Package Cosmos.MultiTenancy -Version 0.2.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="0.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Cosmos.MultiTenancy" Version="0.2.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 0.2.0
                    
#r "nuget: Cosmos.MultiTenancy, 0.2.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@0.2.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=0.2.0
                    
Install as a Cake Addin
#tool nuget:?package=Cosmos.MultiTenancy&version=0.2.0
                    
Install as a Cake Tool

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.):

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.TenantId a IDocumentStore.OpenSession(tenantId).

Consideraciones de diseño

  • Scope: se recomienda registrar como Scoped para 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 IServiceProvider no tiene ITenantResolver 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

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.

Version Downloads Last Updated
0.2.0 147 5/21/2026
0.1.1 60 5/20/2026
0.1.0 38 5/20/2026