From b2fabcb832c97377ba5714391b4cea0ec352cdc7 Mon Sep 17 00:00:00 2001 From: Anthony Simmon Date: Wed, 19 Jun 2024 14:33:07 -0400 Subject: [PATCH] Improve domain event propagation docs to show how to modify Event Grid options and expose the client names (#143) --- README.md | 11 +++++++++++ .../EventPropagationClientTests.cs | 4 ++-- ...ollectionEventPropagationExtensionsTests.cs | 4 ++-- .../EventPropagationClient.cs | 4 ++-- .../EventPropagationPublisherBuilder.cs | 4 ++-- .../EventPropagationPublisherOptions.cs | 18 ++++++++++++++---- .../PublicAPI.Shipped.txt | 1 + 7 files changed, 34 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 3a6af6f3..eac36fdd 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,17 @@ public class ExampleDomainEventHandler : IDomainEventHandler } ``` +## Configure the underlying Event Grid clients options + +You can use the [named options pattern](https://learn.microsoft.com/en-us/dotnet/core/extensions/options#named-options-support-using-iconfigurenamedoptions) to configure the behavior of the underlying Event Grid clients. For instance: + +```csharp +services.Configure(EventPropagationPublisherOptions.EventGridClientName, options => +{ + options.Retry.NetworkTimeout = TimeSpan.FromSeconds(15); +}); +``` + ## Additional notes * 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. diff --git a/src/Workleap.DomainEventPropagation.Publishing.Tests/EventPropagationClientTests.cs b/src/Workleap.DomainEventPropagation.Publishing.Tests/EventPropagationClientTests.cs index 2755f3e5..69766cbd 100644 --- a/src/Workleap.DomainEventPropagation.Publishing.Tests/EventPropagationClientTests.cs +++ b/src/Workleap.DomainEventPropagation.Publishing.Tests/EventPropagationClientTests.cs @@ -24,8 +24,8 @@ public abstract class EventPropagationClientTests protected EventPropagationClientTests(IOptions publisherOptions) { this._publisherOptions = publisherOptions; - A.CallTo(() => this.EventGridPublisherClientFactory.CreateClient(EventPropagationPublisherOptions.CustomTopicClientName)).Returns(this.EventGridPublisherClient); - A.CallTo(() => this.EventGridClientFactory.CreateClient(EventPropagationPublisherOptions.NamespaceTopicClientName)).Returns(this.EventGridClient); + A.CallTo(() => this.EventGridPublisherClientFactory.CreateClient(EventPropagationPublisherOptions.EventGridClientName)).Returns(this.EventGridPublisherClient); + A.CallTo(() => this.EventGridClientFactory.CreateClient(EventPropagationPublisherOptions.EventGridClientName)).Returns(this.EventGridClient); this.EventPropagationClient = new EventPropagationClient( this.EventGridPublisherClientFactory, diff --git a/src/Workleap.DomainEventPropagation.Publishing.Tests/ServiceCollectionEventPropagationExtensionsTests.cs b/src/Workleap.DomainEventPropagation.Publishing.Tests/ServiceCollectionEventPropagationExtensionsTests.cs index f46feaf4..e736cd3a 100644 --- a/src/Workleap.DomainEventPropagation.Publishing.Tests/ServiceCollectionEventPropagationExtensionsTests.cs +++ b/src/Workleap.DomainEventPropagation.Publishing.Tests/ServiceCollectionEventPropagationExtensionsTests.cs @@ -78,7 +78,7 @@ public void GivenConfigWithAccessKey_WhenAddEventPropagationPublisher_ThenEventG services.AddEventPropagationPublisher(); var serviceProvider = services.BuildServiceProvider(); var clientFactory = serviceProvider.GetRequiredService>(); - var client = clientFactory.CreateClient(EventPropagationPublisherOptions.CustomTopicClientName); + var client = clientFactory.CreateClient(EventPropagationPublisherOptions.EventGridClientName); // Then Assert.NotNull(client); @@ -104,7 +104,7 @@ public void GivenConfigWithTokenCredentials_WhenAddEventPropagationPublisher_The }); var serviceProvider = services.BuildServiceProvider(); var clientFactory = serviceProvider.GetRequiredService>(); - var client = clientFactory.CreateClient(EventPropagationPublisherOptions.CustomTopicClientName); + var client = clientFactory.CreateClient(EventPropagationPublisherOptions.EventGridClientName); // Then Assert.NotNull(client); diff --git a/src/Workleap.DomainEventPropagation.Publishing/EventPropagationClient.cs b/src/Workleap.DomainEventPropagation.Publishing/EventPropagationClient.cs index 717f3625..503dd452 100644 --- a/src/Workleap.DomainEventPropagation.Publishing/EventPropagationClient.cs +++ b/src/Workleap.DomainEventPropagation.Publishing/EventPropagationClient.cs @@ -30,8 +30,8 @@ internal sealed class EventPropagationClient : IEventPropagationClient { this._eventPropagationPublisherOptions = eventPropagationPublisherOptions.Value; this._pipeline = publishingDomainEventBehaviors.Reverse().Aggregate((DomainEventsHandlerDelegate)this.SendDomainEventsAsync, BuildPipeline); - this._eventGridPublisherClient = eventGridPublisherClientFactory.CreateClient(EventPropagationPublisherOptions.CustomTopicClientName); - this._eventGridNamespaceClient = eventGridClientFactory.CreateClient(EventPropagationPublisherOptions.NamespaceTopicClientName); + this._eventGridPublisherClient = eventGridPublisherClientFactory.CreateClient(EventPropagationPublisherOptions.EventGridClientName); + this._eventGridNamespaceClient = eventGridClientFactory.CreateClient(EventPropagationPublisherOptions.EventGridClientName); } private static DomainEventsHandlerDelegate BuildPipeline(DomainEventsHandlerDelegate accumulator, IPublishingDomainEventBehavior next) diff --git a/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherBuilder.cs b/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherBuilder.cs index 8e8228cd..0a65c381 100644 --- a/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherBuilder.cs +++ b/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherBuilder.cs @@ -42,11 +42,11 @@ private static void BindFromWellKnownConfigurationSection(EventPropagationPublis private static void ConfigureEventPublisherClients(AzureClientFactoryBuilder builder) { builder.AddClient(EventGridPublisherClientFactory) - .WithName(EventPropagationPublisherOptions.CustomTopicClientName) + .WithName(EventPropagationPublisherOptions.EventGridClientName) .ConfigureOptions(ConfigureClientOptions); builder.AddClient(EventGridClientFactory) - .WithName(EventPropagationPublisherOptions.NamespaceTopicClientName) + .WithName(EventPropagationPublisherOptions.EventGridClientName) .ConfigureOptions(ConfigureClientOptions); } diff --git a/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherOptions.cs b/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherOptions.cs index c6d14f07..695ee78d 100644 --- a/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherOptions.cs +++ b/src/Workleap.DomainEventPropagation.Publishing/EventPropagationPublisherOptions.cs @@ -12,10 +12,20 @@ public sealed class EventPropagationPublisherOptions { internal const string SectionName = "EventPropagation:Publisher"; - // EventPropagationClient was the legacy name when only one kind of topic was supported - internal const string CustomTopicClientName = "EventPropagationClient"; - - internal const string NamespaceTopicClientName = "NamespaceTopicClient"; + /// + /// This is the name of the underlying named options for and . + /// They are used when creating the corresponding and . + /// + /// + /// Use this option name to customize the Event Grid clients. + /// + /// services.Configure<EventGridPublisherClientOptions>(EventPropagationPublisherOptions.EventGridClientName, options => + /// { + /// // ... + /// }). + /// + /// + public const string EventGridClientName = "DomainEventPropagation"; public string TopicAccessKey { get; set; } = string.Empty; diff --git a/src/Workleap.DomainEventPropagation.Publishing/PublicAPI.Shipped.txt b/src/Workleap.DomainEventPropagation.Publishing/PublicAPI.Shipped.txt index c9e79655..911e06ab 100644 --- a/src/Workleap.DomainEventPropagation.Publishing/PublicAPI.Shipped.txt +++ b/src/Workleap.DomainEventPropagation.Publishing/PublicAPI.Shipped.txt @@ -1,4 +1,5 @@ #nullable enable +const Workleap.DomainEventPropagation.EventPropagationPublisherOptions.EventGridClientName = "DomainEventPropagation" -> string! static Workleap.DomainEventPropagation.ServiceCollectionEventPropagationExtensions.AddEventPropagationPublisher(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Workleap.DomainEventPropagation.IEventPropagationPublisherBuilder! static Workleap.DomainEventPropagation.ServiceCollectionEventPropagationExtensions.AddEventPropagationPublisher(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Workleap.DomainEventPropagation.IEventPropagationPublisherBuilder! Workleap.DomainEventPropagation.EventPropagationPublisherOptions