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                
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="Aethel.Infrastructure.Demeter" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Aethel.Infrastructure.Demeter --version 1.0.0                
#r "nuget: Aethel.Infrastructure.Demeter, 1.0.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.
// 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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 305 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