Aethel.Infrastructure.Demeter
1.0.0
dotnet add package Aethel.Infrastructure.Demeter --version 1.0.0
NuGet\Install-Package Aethel.Infrastructure.Demeter -Version 1.0.0
<PackageReference Include="Aethel.Infrastructure.Demeter" Version="1.0.0" />
paket add Aethel.Infrastructure.Demeter --version 1.0.0
#r "nuget: Aethel.Infrastructure.Demeter, 1.0.0"
// Install Aethel.Infrastructure.Demeter as a Cake Addin #addin nuget:?package=Aethel.Infrastructure.Demeter&version=1.0.0 // Install Aethel.Infrastructure.Demeter as a Cake Tool #tool nuget:?package=Aethel.Infrastructure.Demeter&version=1.0.0
Demeter
Version inicial
Demeter es un bus de eventos simple que permite publicar un tema y escuchar los mensajes en una cola especifica. Está principalmente pensada en aplicaciones modulares monoliticas donde necesitamos comunicar modulos que estan fisicamente en el mismo proyecto pero que estan logicamente separados utilizando DDD. Tiene la implementacion basada en sql server en una estructura similar a SQS y SNS de aws o los EventGrid de Azure.
Features
- Posibilidad de publicar en un tema especifico
- Posibilidad de suscribirse a multiples temas
- Recepcion de los mensajes en una unica cola
Configuracion
Para integrar Demeter en su proyecto necesitamos lo siguiente
services.AddDemeter(options =>
{
options.DefaultQueueName = demeterSettings.Queue;
options.DefaultTopicName = demeterSettings.Topic;
options.IntegrationEventAssembly = typeof(GarageCreatedIntegrationEvent).Assembly;
options.Subscriptions = demeterSettings.Subscriptions;
options.UseSqlServer(sqlOptions =>
{
sqlOptions.ConnectionString = demeterSettings.Database;
});
});
services.BuildServiceProvider().GetService<IDemeterInitializer>().InitAsync().Wait();
DefaultQueueName es la cola que escucharemos los mensajes, si la cola no existe, se crea. Cada cola solo puede estar asociada a un suscriptor, no pueden escuchar dos modulos a una cola, debido al control de de eventos leidos para cada modulo. Si un modulo lo marca como leido, el modulo dos no podra acceder a este.
DefaultTopicName es el tema bajo el cual vamos a publicar los mensajes, esta etiqueta es a la cual, las colas se suscriben y por el cual podemos tener muchos suscriptores para un mensaje, al igual, podemmos tener muchos temas asociados a una cola
IntegrationEventAssembly contiene una capa que permite enviar un tipo de evento o mensaje y que al recibirlo en el otro extremo lo entrega en el mismo tipo. Para hacer eso, debemos de tener un ensamblado donde se encuentren nuestros modelos de eventos compartidos, que servira para reconstruir los eventos desde la fuente hasta el destino-
Subscriptions es una lista de cadenas que indican cuales son los temas a los cuales nos suscribimos para escuchar los eventos y que estos se depositen en el buzon especificado anteriormmente.
La extension de useSqlServer permite habilitar el funcionammiento con sql server listo para leer desde la tabla de sql server y realizar todas las operaciones disponibles, tan solo hace falta pasar la cadena de conexion.
La ultima linea permite inicializar las configuraciones, registrar la cola si no existe, registrar el tema si no existe y suscribirse a los temas especificados.
Uso
Para usar Demeter, primero tenemos que publicar mensajes o eventos de integracion. Los eventos de integracion deben de ser construidos asi:
public class GarageCreatedIntegrationEvent : IntegrationEvent {
}
Deben de implementar la clase base para poder ser aceptados por el bus de eventos. Una vez teniendo los eventos de integracion listos para distribuirlos, entonces los enviaremos en el bus de la siguiente forma
var integrationEvent = new GarageCreatedIntegrationEvent(request.Id, request.OcurredOn,
request.GarageRegistrationId,request.GarageName,request.RegistrantEmail,request.RegistrantName);
await _demeterClient.PublishAsync(integrationEvent);
De esta forma estamos enviando el evento al tema configurado para el modulo y demeter se encarga de distribuirlo a todas las colas suscritas al tema.
Para consumir los mensajes de una cola, haremos los siguiente
var messages = await _demeterClient.Consume();
Aqui, demeter nos entrega una lista de mensajes de tipo IntegrationEvent, listos para ser distribuidos o utilizados. Se recomienda hacer uso de MediatR para la distribucion de eventos locales.
Versiones y fechas de lanzamiento
Version | Fecha de lanzamiento | Features | Status |
---|---|---|---|
1.0.0 | Abr 2020 | Arquitectura y configuraciones iniciales para usar demeter como publicador y suscriptor. Se habilita la suscripcion a multiples temas, se puede publicar en un tema y se puede escuchar una cola | Liberada |
License
MIT
If it works, learn how it do
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Dapper (>= 2.0.123)
- MediatR (>= 10.0.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Options (>= 6.0.0)
- Newtonsoft.Json (>= 13.0.1)
- SqlKata (>= 2.3.7)
- System.Data.SqlClient (>= 4.8.3)
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.0.0 | 307 | 4/11/2022 |
Arquitectura y configuraciones iniciales para usar demeter como publicador y suscriptor. Se habilita la suscripcion a multiples temas, se puede publicar en un tema y se puede escuchar una cola