Cosmos.EventDriven.CritterStack
1.2.2
dotnet add package Cosmos.EventDriven.CritterStack --version 1.2.2
NuGet\Install-Package Cosmos.EventDriven.CritterStack -Version 1.2.2
<PackageReference Include="Cosmos.EventDriven.CritterStack" Version="1.2.2" />
<PackageVersion Include="Cosmos.EventDriven.CritterStack" Version="1.2.2" />
<PackageReference Include="Cosmos.EventDriven.CritterStack" />
paket add Cosmos.EventDriven.CritterStack --version 1.2.2
#r "nuget: Cosmos.EventDriven.CritterStack, 1.2.2"
#:package Cosmos.EventDriven.CritterStack@1.2.2
#addin nuget:?package=Cosmos.EventDriven.CritterStack&version=1.2.2
#tool nuget:?package=Cosmos.EventDriven.CritterStack&version=1.2.2
Cosmos.EventDriven.CritterStack
Implementaciones de Wolverine para IPublicEventSender e IPrivateEventSender en Cosmos EDA con .NET 10.
Descripción
Este paquete provee las implementaciones concretas de los senders de eventos usando Wolverine como bus de mensajería. Separa explícitamente el envío de eventos públicos (inter-servicio) de los eventos privados (intra-servicio, dentro del mismo bounded context).
Características
- WolverinePublicEventSender: Implementación de
IPublicEventSenderque publicaIPublicEventa través del bus Wolverine hacia brokers externos (RabbitMQ, Azure Service Bus) - WolverinePrivateEventSender: Implementación de
IPrivateEventSenderque despachaIPrivateEventde forma local dentro del mismo proceso - AgregarWolverineEventSender: Método de extensión para registrar ambos senders en el contenedor de dependencias
Propagación de identidad
Ambos senders resuelven el tenant y el usuario actuales vía ITenantResolver y los adjuntan a cada evento:
- El TenantId se envía en
DeliveryOptions.TenantId; Wolverine lo propaga de forma nativa alIMessageContextdel handler receptor. - El UserId no tiene propagación nativa, por lo que se adjunta como el header
user_iddel envelope. Del otro lado,WolverineMessageContextTenantResolver(deCosmos.MultiTenancy.CritterStack) lo lee de ese header.
Como el sender re-lee el UserId del resolver en cada publicación, la identidad se re-propaga automáticamente a lo largo de cadenas de handlers anidados. Si el ITenantResolver no puede resolver el UserId, la publicación lanza InvalidOperationException.
Regla: nada de EDA in-memory
Todo evento que el servicio publica debe tener una ruta a un broker externo configurada dentro de UseWolverine(...):
- RabbitMQ:
opts.HabilitarOutboxParaEventosPublicos(serviceName, contratos)yopts.HabilitarOutboxParaEventosPrivados(serviceName, contratos) - Azure Service Bus:
opts.PublicarEvento<TEvento>(topicName)oopts.PublicarEventosServerless(topicName, contratos)
Por qué: si Wolverine no tiene ruta para un evento, lo despacha a una cola local in-memory dentro del mismo proceso. Por esa cola IMessageContext.TenantId no se propaga, y los handlers que dependen de ITenantResolver fallan silenciosamente — el síntoma aparenta ser un bug del resolver cuando en realidad es esta configuración faltante.
Los servicios consumidores — que solo manejan eventos definidos en el assembly de contratos de otro servicio, suscritos vía SuscribirseAServicio — no necesitan declarar rutas de publicación para esos eventos: la regla aplica únicamente a los eventos que el servicio publica.
Instalación
dotnet add package Cosmos.EventDriven.CritterStack
Uso
Registrar los senders en DI
builder.Services.AgregarWolverineEventSender();
Enviar un evento público
using Cosmos.EventDriven.Abstractions;
public record PedidoCreado(Guid PedidoId, string ClienteId) : IPublicEvent;
public class MiServicio(IPublicEventSender sender)
{
public async Task CrearPedido(...)
{
// ... lógica de negocio
await sender.PublishAsync(new PedidoCreado(pedidoId, clienteId));
}
}
Enviar un evento privado
using Cosmos.EventDriven.Abstractions;
public record StockActualizado(Guid ProductoId, int Cantidad) : IPrivateEvent;
public class InventarioServicio(IPrivateEventSender sender)
{
public async Task ActualizarStock(...)
{
// ... lógica de negocio
await sender.PublishAsync(new StockActualizado(productoId, cantidad));
}
}
Requisitos
- .NET 10.0 o superior
- Wolverine configurado en el host (
UseWolverine)
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
- Cosmos.EventDriven.Abstractions (>= 1.2.2)
- Cosmos.MultiTenancy (>= 1.2.2)
- WolverineFx (>= 6.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.2 | 64 | 6/12/2026 |
| 1.2.1 | 56 | 6/12/2026 |
| 1.2.0 | 53 | 6/11/2026 |
| 1.1.0 | 216 | 6/3/2026 |
| 1.0.0 | 134 | 6/2/2026 |
| 0.3.1 | 112 | 6/2/2026 |
| 0.3.0 | 211 | 5/28/2026 |
| 0.2.2 | 129 | 5/28/2026 |
| 0.2.1 | 125 | 5/28/2026 |
| 0.2.0 | 119 | 5/28/2026 |
| 0.1.0 | 202 | 5/26/2026 |
| 0.0.7 | 295 | 5/20/2026 |
| 0.0.6 | 104 | 5/6/2026 |
| 0.0.5 | 844 | 3/18/2026 |
| 0.0.4 | 344 | 3/17/2026 |
| 0.0.3 | 191 | 3/12/2026 |
| 0.0.2 | 108 | 3/12/2026 |
| 0.0.1 | 114 | 3/12/2026 |
| 0.0.1-RC.3 | 73 | 3/11/2026 |
| 0.0.1-RC.2 | 64 | 3/11/2026 |