CodeDesignPlus.Net.PubSub
1.0.0-beta.13683
dotnet add package CodeDesignPlus.Net.PubSub --version 1.0.0-beta.13683
NuGet\Install-Package CodeDesignPlus.Net.PubSub -Version 1.0.0-beta.13683
<PackageReference Include="CodeDesignPlus.Net.PubSub" Version="1.0.0-beta.13683" />
<PackageVersion Include="CodeDesignPlus.Net.PubSub" Version="1.0.0-beta.13683" />
<PackageReference Include="CodeDesignPlus.Net.PubSub" />
paket add CodeDesignPlus.Net.PubSub --version 1.0.0-beta.13683
#r "nuget: CodeDesignPlus.Net.PubSub, 1.0.0-beta.13683"
#:package CodeDesignPlus.Net.PubSub@1.0.0-beta.13683
#addin nuget:?package=CodeDesignPlus.Net.PubSub&version=1.0.0-beta.13683&prerelease
#tool nuget:?package=CodeDesignPlus.Net.PubSub&version=1.0.0-beta.13683&prerelease
CodeDesignPlus.Net.PubSub
Description
CodeDesignPlus.Net.PubSub provides a robust framework for implementing publish-subscribe patterns in .NET Core applications. This library simplifies the process of publishing and subscribing to messages, enabling developers to build scalable and decoupled event-driven systems.
Table of Contents
About The Project
CodeDesignPlus.Net.PubSub provides a robust framework for implementing publish-subscribe patterns in .NET Core applications. This library simplifies the process of publishing and subscribing to messages, enabling developers to build scalable and decoupled event-driven systems.
Key Features
- Ease of Use: Simplifies the implementation of publish-subscribe patterns.
- Scalability: Designed to support scalable and decoupled event-driven architectures.
- Integration: Seamlessly integrates with other CodeDesignPlus.Net libraries.
- Comprehensive Documentation: Includes extensive documentation and support for common tasks.
Installation
To install the package, run the following command:
dotnet add package CodeDesignPlus.Net.PubSub
Usage
For more information regarding the library, you can visit our documentation at CodeDesignPlus Doc
Sincronización inicial de proyecciones (fotos)
Una copia local que se alimenta de eventos solo recibe lo que pasa desde que existe su cola. Para que nazca completa, la copia pide una foto al arrancar y el dueño contesta con un evento de foto por agregado, dirigido a quien la pidió y paginado. La copia aplica con upsert y marca la fuente como sincronizada.
Lado del dueño
Declare el evento de foto del agregado, con su estado completo, heredando de
SnapshotDomainEvent:[EventKey<AssemblyAggregate>(1, "AssemblySnapshotDomainEvent")] public class AssemblySnapshotDomainEvent(Guid aggregateId, string title, Instant scheduledDate, Instant? completedAt, bool isCancelled, Guid tenant, Guid? eventId = null, Instant? occurredAt = null, Dictionary<string, object>? metadata = null) : SnapshotDomainEvent(aggregateId, tenant, eventId, occurredAt, metadata) { ... }Implemente
ISnapshotSource<TSnapshot>: devuelve una página de fotos con orden estable (porId), de una copropiedad o de todas. Póngala en el ensamblado del worker. El SDK la descubre y se suscribe solo aSnapshotRequestedDomainEvent; contesta las peticiones que nombran suCore:AppName, el agregado y el nombre de esa foto. Un agregado puede tener varias fotos (una por vista que copian otros), cada una con su fuente.public class AssemblySnapshotSource(IAssemblyRepository repository) : ISnapshotSource<AssemblySnapshotDomainEvent> { public async Task<IReadOnlyList<AssemblySnapshotDomainEvent>> GetPageAsync(Guid? tenant, int page, int pageSize, CancellationToken cancellationToken) { var assemblies = await repository.GetPageAsync(tenant, page, pageSize, cancellationToken); return [.. assemblies.Select(x => new AssemblySnapshotDomainEvent(x.Id, ...))]; } }
El tamaño de página es PubSub:SnapshotPageSize (100 por defecto).
Lado de la copia
Declare el gemelo del evento de foto: la clave nombra al dueño (aplicación) y al agregado (entidad). De ahí sale a quién se le pide.
[EventKey("AssemblyAggregate", 1, "AssemblySnapshotDomainEvent", "ms-assemblies", "kappali")] public class AssemblySnapshotDomainEvent(...) : SnapshotDomainEvent(...)Consuma la foto heredando de
SnapshotHandler<TSnapshot>e implementeApplyAsynccomo un upsert idempotente. Para no pisar un evento en vivo más nuevo, la copia guarda elOccurredAtdel último evento del dueño que aplicó (un campo nuevo fuera del constructor) y solo reemplaza sisnapshot.Supersedes(copia.SourceChangedAt).[QueueName<AssemblyProjectionAggregate>("AssemblySnapshotHandler")] public class AssemblySnapshotHandler(IAssemblyProjectionRepository repository, IOptions<CoreOptions> coreOptions) : SnapshotHandler<AssemblySnapshotDomainEvent>(coreOptions) { protected override async Task ApplyAsync(AssemblySnapshotDomainEvent snapshot, CancellationToken cancellationToken) { ... } }Nada más. Con un
SnapshotHandleren el ensamblado, el SDK:- espera a que estén suscritos todos los consumidores (una foto publicada antes de que exista la cola se pierde);
- mira en
IProjectionSyncStoresi esa foto ya está sincronizada (un documento por dueño y evento de foto) (CodeDesignPlus.Net.Mongolo registra: colecciónProjectionSyncState); si no, publicaSnapshotRequestedDomainEventy lo anota; - al llegar
SnapshotCompletedDomainEventde esa petición, marca la fuente como sincronizada.
Para reparar una copropiedad a mano, inyecte ISnapshotRequester y llame a
RequestAsync<AssemblySnapshotDomainEvent>(tenant, token) desde un endpoint de soporte. Para volver a pedir la foto
completa, borre el documento de esa foto en ProjectionSyncState y reinicie el micro.
Lo que hay que saber
- Las peticiones y los cierres son contratos de plataforma con clave fija (
codedesignplus.ms-snapshots.v1.projectionsnapshot.*): todas las aplicaciones publican y escuchan en el mismo tema y descartan lo que no las nombra. - Las fotos van al tema del evento de foto de cada pareja; si dos copias del mismo agregado sincronizan, cada una
descarta la que pidió la otra (
RequestedBy). - Pedir dos veces (dos réplicas, un reinicio antes del cierre) no duplica: la copia aplica con upsert.
- Todo es aditivo: un consumidor desplegado que no conoce los eventos nuevos no cambia.
Roadmap
Refer to issues for a list of proposed features and known issues.
Roadmap
- Fork the Project
- Create your Feature Branch (git checkout -b features/AmazingFeature)
- Commit your Changes (git commit -m 'Add some AmazingFeature')
- Push to the Branch (git push origin feature/AmazingFeature)
- Open a Pull Request
License
Distributed under the MIT License. See LICENSE for more information.
Contact
CodeDesignPlus - @CodeDesignPlus - wliscano@codedesignplus.com
Project Link: CodeDesignPlus.Net.PubSub
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
-
net9.0
- CodeDesignPlus.Net.PubSub.Abstractions (>= 1.0.0-beta.13683)
- Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions (>= 9.0.7)
- Microsoft.Extensions.Hosting.Abstractions (>= 9.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.7)
- Microsoft.Extensions.Options (>= 9.0.7)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.7)
- Microsoft.Extensions.Options.DataAnnotations (>= 9.0.7)
- OpenTelemetry (>= 1.12.0)
NuGet packages (5)
Showing the top 5 NuGet packages that depend on CodeDesignPlus.Net.PubSub:
| Package | Downloads |
|---|---|
|
CodeDesignPlus.Net.RabbitMQ.Abstractions
CodeDesignPlus.Net.RabbitMQ.Abstractions provides essential interfaces and abstract classes for integrating RabbitMQ with .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using RabbitMQ, enabling better testing and extensibility. |
|
|
CodeDesignPlus.Net.EventStore.PubSub.Abstractions
CodeDesignPlus.Net.EventStore.PubSub.Abstractions provides essential interfaces and abstract classes for implementing publish-subscribe patterns in event sourcing within .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems, enabling better testing and extensibility. |
|
|
CodeDesignPlus.Net.Redis.PubSub.Abstractions
CodeDesignPlus.Net.Redis.PubSub.Abstractions provides essential interfaces and abstract classes for implementing publish-subscribe patterns with Redis in .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using Redis, enabling better testing and extensibility. |
|
|
CodeDesignPlus.Net.Kafka.Abstractions
CodeDesignPlus.Net.Kafka.Abstractions provides essential interfaces and abstract classes for integrating Apache Kafka with .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using Kafka, enabling better testing and extensibility. |
|
|
CodeDesignPlus.Net.ServiceBus.Abstractions
CodeDesignPlus.Net.ServiceBus.Abstractions provides essential interfaces and abstract classes for integrating Azure Service Bus with .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using Azure Service Bus topics and subscriptions, enabling better testing and extensibility. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0-beta.13683 | 47 | 10/15/2026 |
| 1.0.0-beta.13676 | 152 | 10/15/2026 |
| 1.0.0-beta.13664 | 57 | 10/15/2026 |
| 1.0.0-beta.13642 | 97 | 10/14/2026 |
| 1.0.0-beta.13633 | 96 | 10/13/2026 |
| 1.0.0-beta.13622 | 132 | 10/6/2026 |
| 1.0.0-beta.13614 | 101 | 10/6/2026 |
| 1.0.0-beta.13605 | 108 | 10/5/2026 |
| 1.0.0-beta.13603 | 91 | 10/5/2026 |
| 1.0.0-beta.13598 | 95 | 10/5/2026 |
| 1.0.0-beta.13592 | 130 | 10/4/2026 |
| 1.0.0-beta.13584 | 156 | 10/3/2026 |
| 1.0.0-beta.13582 | 201 | 10/2/2026 |
| 1.0.0-beta.13576 | 109 | 10/2/2026 |
| 1.0.0-beta.13574 | 96 | 10/2/2026 |
| 1.0.0-beta.13571 | 213 | 10/1/2026 |
| 1.0.0-beta.13563 | 192 | 10/1/2026 |
| 1.0.0-beta.13561 | 198 | 10/1/2026 |
| 1.0.0-beta.13557 | 94 | 10/1/2026 |
| 0.11.0 | 967 | 7/23/2025 |