Workleap.DomainEventPropagation.Subscription 0.1.0-preview.27

Prefix Reserved
This is a prerelease version of Workleap.DomainEventPropagation.Subscription.
There is a newer version of this package available.
See the version list below for details.
dotnet add package Workleap.DomainEventPropagation.Subscription --version 0.1.0-preview.27                
NuGet\Install-Package Workleap.DomainEventPropagation.Subscription -Version 0.1.0-preview.27                
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="Workleap.DomainEventPropagation.Subscription" Version="0.1.0-preview.27" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Workleap.DomainEventPropagation.Subscription --version 0.1.0-preview.27                
#r "nuget: Workleap.DomainEventPropagation.Subscription, 0.1.0-preview.27"                
#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 Workleap.DomainEventPropagation.Subscription as a Cake Addin
#addin nuget:?package=Workleap.DomainEventPropagation.Subscription&version=0.1.0-preview.27&prerelease

// Install Workleap.DomainEventPropagation.Subscription as a Cake Tool
#tool nuget:?package=Workleap.DomainEventPropagation.Subscription&version=0.1.0-preview.27&prerelease                

Workleap.DomainEventPropagation

build

Getting started

Package Download Link Description
Workleap.DomainEventPropagation.Abstractions nuget Contains abstractions that are used for publishing and receiving events
Workleap.DomainEventPropagation.Publishing nuget Contains classes to publish events
Workleap.DomainEventPropagation.Subscription nuget Contains classes to subscribe to topics and receive events

What does the Workleap.DomainEventPropagation.* packages do?

  • Create webhook endpoint and interfaces for receiving events
  • Allow publishing events to Event Grid topics

Using the Workleap.DomainEventPropagation.Publishing package to publish events

When using dotnet core, you can register event propagation at startup in the service collection.

// Method 1: Lazily bind the options to a configuration section
services.AddEventPropagationPublisher();
services.AddOptions<EventPropagationPublisherOptions>().BindConfiguration(EventPropagationPublisherOptions.SectionName);

// Method 2: Set options values directly in C#
services.AddEventPropagationPublisher(opt =>
{
  opt.TopicName = "<topic_name_to_publish_to>",
  opt.TopicAccessKey = "<provided from keyVault>",
  opt.TopicEndpoint = "<azure_topic_uri>"
});

// Method 3: Use RBAC
services.AddEventPropagationPublisher(o => o.TokenCredential = new ManagedIdentityCredential());

Configuration is required. Configuration can be loaded from the appsettings file by passing the IConfiguration instance (see above). The topic access key should be stored securely in a key vault.

{
  "EventPropagation": {
    "TopicName": "<topic_name_to_publish_to>",
    "TopicAccessKey": "<keyVault_provided_value>",
    "TopicEndpoint": "<azure_topic_uri>"
  }
}

To publish an event, use the IEventPropagationClient interface (via dependency injection). Use the PublishDomainEventAsync to publish the event. The required subject parameter is a string description to provide context for the event.

var domainEvent = new ExampleDomainEvent
{
    Id = Guid.NewGuid().ToString(),
    Date = DateTime.UtcNow
};

await this._eventPropagationClient.PublishDomainEventAsync(subject: "TestEventPublication", domainEvent);

Using the Workleap.EventPropagation.Subscription package to subscribe to events

When using ASP.NET Core with .NET 6+, you can register event propagation subscriptions at startup in the service collection. To configure the subscriber, the list of subscribed topics is required.

services
    .AddEventPropagationSubscriber()
    .AddDomainEventHandlersFromAssembly(Assembly.GetExecutingAssembly());

// or add a single domain event handler
.AddDomainEventHandler<ExampleDomainEventHandler>()

This can be used to register endpoint to receive events

app.UseRouting();
...
app.UseEndpoints(builder =>
{
    builder.AddEventPropagationEndpoints();
});
Define domain event handlers

You must define domain event handlers for events you wish to handle. You are not obligated to handle every possible event from a topic.

Domain event handlers must implement the IDomainEventHandler<> interface.

public class ExampleDomainEventHandler : IDomainEventHandler<ExampleDomainEvent>
{
    public Task HandleDomainEventAsync(ExampleDomainEvent domainEvent, CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}
Restrictions
  • You may only define one domain event handler per domain event you wish to handle. If you would require more, use the single allowed domain event handler as a facade for multiple operations.
  • DomainEventHandlers must have idempotent behavior (you could execute it multiple times for the same event and the result would always be the same).
  • DomainEventHandlers should use the property DataVersion (when necessary)

Exposing domain events

To expose your service’s domain events, you must provide a NuGet package with all domain (class) definitions. Your project must reference the Workleap.DomainEventPropagation.Abstractions package and your domain events must implement the IDomainEvent interface.

public class ExampleDomainEvent : IDomainEvent
{
    public string Id { get; set; }

    public DateTime Date { get; set; }

    public string DataVersion => "1";
}

It is recommended to use a separate pipeline to publish domain event definitions. Any existing pipeline can be reused with minor tweaks to achieve this.

Restrictions
  • Domain events must only contain Ids and types (any content is optional). In some rare cases, an immutable field could be added to the event, however this comes at risk of exposing PII information.
  • Changes to domain events should be additive
  • Domain events must implement the DataVersion property
  • Domain event projects should follow the pattern Workleap.[Service].[DomainEvents] (Service would usually match the topic name).
  • Event Grid limits event size to 64 kb. This means a regular event could contain a maximum of about 1500 Guid ids. Keep in mind the size restriction when sending batch events. Do not hesitate to split a larger event into multiple, smaller domain events.

Building, releasing and versioning

The project can be built by running Build.ps1. It uses Microsoft.CodeAnalysis.PublicApiAnalyzers to help detect public API breaking changes. Use the built-in roslyn analyzer to ensure that public APIs are declared in PublicAPI.Shipped.txt, and obsolete public APIs in PublicAPI.Unshipped.txt.

A new preview NuGet package is automatically published on any new commit on the main branch. This means that by completing a pull request, you automatically get a new NuGet package.

When you are ready to officially release a stable NuGet package by following the SemVer guidelines, simply manually create a tag with the format x.y.z. This will automatically create and publish a NuGet package for this version.

License

Copyright © 2023, Workleap This code is licensed under the Apache License, Version 2.0. You may obtain a copy of this license at https://github.com/gsoft-inc/gsoft-license/blob/master/LICENSE.

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 (1)

Showing the top 1 NuGet packages that depend on Workleap.DomainEventPropagation.Subscription:

Package Downloads
Workleap.DomainEventPropagation.Subscription.ApplicationInsights

Propagate domain events with Azure

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.1-preview.5 28 11/17/2024
1.1.1-preview.4 36 10/30/2024
1.1.1-preview.3 37 10/28/2024
1.1.1-preview.2 36 10/28/2024
1.1.1-preview.1 35 10/28/2024
1.1.0 1,550 10/9/2024
1.0.2-preview.19 40 10/9/2024
1.0.2-preview.18 48 10/1/2024
1.0.2-preview.17 44 10/1/2024
1.0.2-preview.16 45 10/1/2024
1.0.2-preview.15 44 10/1/2024
1.0.2-preview.14 59 10/1/2024
1.0.2-preview.13 34 9/20/2024
1.0.2-preview.12 27 9/20/2024
1.0.2-preview.11 44 8/27/2024
1.0.2-preview.10 45 8/27/2024
1.0.2-preview.9 43 8/27/2024
1.0.2-preview.7 39 8/27/2024
1.0.2-preview.5 38 8/27/2024
1.0.2-preview.4 39 8/27/2024
1.0.2-preview.3 39 8/27/2024
1.0.2-preview.2 42 8/27/2024
1.0.1 1,499 8/20/2024
1.0.1-preview.2 64 8/20/2024
1.0.1-preview.1 65 8/16/2024
1.0.0 272 8/15/2024
0.6.2-preview.2 74 8/15/2024
0.6.2-preview.1 59 8/15/2024
0.6.1 3,931 8/15/2024
0.6.1-preview.5 64 8/14/2024
0.6.1-preview.4 64 8/14/2024
0.6.1-preview.3 57 8/12/2024
0.6.1-preview.2 33 8/5/2024
0.6.1-preview.1 41 7/26/2024
0.6.0 1,535 7/18/2024
0.5.6-preview.3 54 7/18/2024
0.5.6-preview.2 49 7/18/2024
0.5.6-preview.1 50 7/18/2024
0.5.5-preview.3 35 7/17/2024
0.5.5-preview.2 50 7/15/2024
0.5.4 2,037 6/19/2024
0.5.4-preview.5 49 6/17/2024
0.5.4-preview.4 48 6/17/2024
0.5.4-preview.3 48 6/14/2024
0.5.4-preview.2 46 6/14/2024
0.5.4-preview.1 45 6/13/2024
0.5.3 4,097 5/21/2024
0.5.3-preview.1 63 5/10/2024
0.5.2 10,133 4/17/2024
0.5.2-preview.2 68 4/12/2024
0.5.2-preview.1 54 4/8/2024
0.5.1 1,567 4/8/2024
0.5.1-preview.1 56 4/8/2024
0.4.1-preview.10 66 4/8/2024
0.4.1-preview.9 54 3/28/2024
0.4.1-preview.8 59 3/26/2024
0.4.1-preview.7 62 3/19/2024
0.4.1-preview.6 52 3/18/2024
0.4.1-preview.5 60 3/8/2024
0.4.1-preview.4 56 3/7/2024
0.4.1-preview.3 65 3/4/2024
0.4.1-preview.2 59 3/4/2024
0.4.1-preview.1 61 2/29/2024
0.4.0 14,315 2/27/2024
0.3.1-preview.6 64 2/26/2024
0.3.1-preview.5 60 2/26/2024
0.3.1-preview.4 63 2/23/2024
0.3.1-preview.3 61 2/16/2024
0.3.1-preview.2 70 2/6/2024
0.3.1-preview.1 55 2/6/2024
0.3.0 8,478 1/26/2024
0.2.1-preview.24 62 1/23/2024
0.2.1-preview.23 53 1/22/2024
0.2.1-preview.22 68 1/12/2024
0.2.1-preview.21 55 1/12/2024
0.2.1-preview.20 53 1/12/2024
0.2.1-preview.18 77 12/18/2023
0.2.1-preview.17 101 12/7/2023
0.2.1-preview.16 111 11/17/2023
0.2.1-preview.15 90 11/13/2023
0.2.1-preview.14 71 11/13/2023
0.2.1-preview.13 72 11/7/2023
0.2.1-preview.11 135 10/24/2023
0.2.1-preview.10 78 10/20/2023
0.2.1-preview.8 82 10/17/2023
0.2.1-preview.7 75 10/13/2023
0.2.1-preview.6 82 10/2/2023
0.2.1-preview.5 74 9/26/2023
0.2.1-preview.4 66 9/21/2023
0.2.1-preview.3 77 9/21/2023
0.2.1-preview.2 68 9/21/2023
0.2.1-preview.1 69 9/21/2023
0.2.0 12,703 9/21/2023
0.1.1-preview.6 81 9/20/2023
0.1.1-preview.5 70 9/20/2023
0.1.1-preview.4 74 9/19/2023
0.1.1-preview.3 91 9/13/2023
0.1.1-preview.2 82 9/13/2023
0.1.1-preview.1 92 9/11/2023
0.1.0 179 9/7/2023
0.1.0-preview.33 87 9/7/2023
0.1.0-preview.32 78 8/25/2023
0.1.0-preview.31 74 8/22/2023
0.1.0-preview.30 68 8/18/2023
0.1.0-preview.29 77 8/16/2023
0.1.0-preview.28 72 8/16/2023
0.1.0-preview.27 87 8/15/2023
0.1.0-preview.26 77 8/14/2023
0.1.0-preview.24 94 8/10/2023
0.1.0-preview.23 94 8/9/2023
0.1.0-preview.22 91 8/4/2023
0.1.0-preview.21 85 8/4/2023
0.1.0-preview.20 87 8/3/2023
0.1.0-preview.19 89 8/1/2023
0.1.0-preview.17 85 8/1/2023