Skip to content

Commit cabaccf

Browse files
Feature based api for gateway persisters (#776)
* Feature based api for persisters * Use expose settings * Update src/NServiceBus.Gateway.AcceptanceTests/NonDurableTestSuiteConstaints.cs Co-authored-by: Daniel Marbach <daniel.marbach@openplace.net> * Make ctor public * Rename file --------- Co-authored-by: Daniel Marbach <daniel.marbach@openplace.net>
1 parent 8feca68 commit cabaccf

File tree

12 files changed

+75
-95
lines changed

12 files changed

+75
-95
lines changed

src/NServiceBus.Gateway.AcceptanceTests/GatewayEndpoint.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,13 @@ public override Task<EndpointConfiguration> GetConfiguration(RunDescriptor runDe
1414
var endpointName = endpointCustomizationConfiguration.CustomEndpointName ?? configuration.GetSettings().EndpointName();
1515

1616
var constraints = new GatewayTestSuiteConstraints();
17-
var deduplicationConfiguration = constraints.ConfigureDeduplicationStorage(
17+
18+
var gatewaySettings = constraints.ConfigureGateway(
1819
endpointName,
1920
configuration,
20-
runDescriptor.Settings)
21-
.GetAwaiter().GetResult();
22-
23-
var gatewaySettings = configuration.Gateway(deduplicationConfiguration);
21+
runDescriptor.Settings);
2422

23+
// This is needed to enable the tests to access and modify gateway settings
2524
configuration.GetSettings().Set(gatewaySettings);
2625

2726
runDescriptor.OnTestCompleted(_ => constraints.Cleanup());
Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
namespace NServiceBus.Gateway.AcceptanceTests
2-
{
3-
using System.Threading.Tasks;
4-
using AcceptanceTesting.Support;
1+
namespace NServiceBus.Gateway.AcceptanceTests;
2+
3+
using System.Threading.Tasks;
4+
using AcceptanceTesting.Support;
55

6-
public interface IGatewayTestSuiteConstraints
7-
{
8-
/// <summary>
9-
/// Return the GatewayDeduplicationConfiguration only. The test infrastructure will call endpoingConfig.Gateway(…)
10-
/// </summary>
11-
Task<GatewayDeduplicationConfiguration> ConfigureDeduplicationStorage(string endpointName, EndpointConfiguration configuration, RunSettings settings);
6+
public interface IGatewayTestSuiteConstraints
7+
{
8+
GatewaySettings ConfigureGateway(string endpointName, EndpointConfiguration configuration, RunSettings settings);
129

13-
Task Cleanup();
14-
}
15-
}
10+
Task Cleanup();
11+
}

src/NServiceBus.Gateway.AcceptanceTests/NServiceBus.Gateway.AcceptanceTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
</PropertyGroup>
3434

3535
<ItemGroup>
36-
<RemoveSourceFileFromPackage Include="NonDurableTestSuiteConstaints.cs" />
36+
<RemoveSourceFileFromPackage Include="NonDurableTestSuiteConstraints.cs" />
3737
</ItemGroup>
3838

3939
</Project>

src/NServiceBus.Gateway.AcceptanceTests/NonDurableTestSuiteConstaints.cs

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace NServiceBus.Gateway.AcceptanceTests
2+
{
3+
using System.Threading.Tasks;
4+
using AcceptanceTesting.Support;
5+
6+
//we don't ship this class in the source package since downstreams should provide their own storage config.
7+
public partial class GatewayTestSuiteConstraints
8+
{
9+
public GatewaySettings ConfigureGateway(string endpointName, EndpointConfiguration configuration, RunSettings settings) => configuration.Gateway(new NonDurableDeduplicationConfiguration());
10+
11+
public Task Cleanup() => Task.CompletedTask;
12+
}
13+
}

src/NServiceBus.Gateway.Tests/ApprovalFiles/APIApprovals.Approve.approved.txt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ namespace NServiceBus.Gateway
1818
public abstract class GatewayDeduplicationConfiguration
1919
{
2020
protected GatewayDeduplicationConfiguration() { }
21-
public abstract NServiceBus.Gateway.IGatewayDeduplicationStorage CreateStorage(System.IServiceProvider builder);
22-
public virtual void Setup(NServiceBus.Settings.IReadOnlySettings settings) { }
21+
protected abstract void EnableFeature(NServiceBus.Settings.SettingsHolder settings);
2322
}
2423
public interface IChannelReceiver
2524
{
@@ -44,7 +43,7 @@ namespace NServiceBus.Gateway
4443
{
4544
public NonDurableDeduplicationConfiguration() { }
4645
public int CacheSize { get; set; }
47-
public override NServiceBus.Gateway.IGatewayDeduplicationStorage CreateStorage(System.IServiceProvider builder) { }
46+
protected override void EnableFeature(NServiceBus.Settings.SettingsHolder settings) { }
4847
}
4948
public class ReceiveChannel : NServiceBus.Gateway.Channels.Channel
5049
{
@@ -89,10 +88,12 @@ namespace NServiceBus
8988
{
9089
public static class GatewayExtensions
9190
{
92-
public static NServiceBus.GatewaySettings Gateway(this NServiceBus.EndpointConfiguration config, NServiceBus.Gateway.GatewayDeduplicationConfiguration storageConfiguration) { }
91+
public static NServiceBus.GatewaySettings Gateway<TGatewayDeduplicationConfiguration>(this NServiceBus.EndpointConfiguration config, TGatewayDeduplicationConfiguration storageConfiguration)
92+
where TGatewayDeduplicationConfiguration : NServiceBus.Gateway.GatewayDeduplicationConfiguration { }
9393
}
94-
public class GatewaySettings
94+
public class GatewaySettings : NServiceBus.Configuration.AdvancedExtensibility.ExposeSettings
9595
{
96+
public GatewaySettings(NServiceBus.Settings.SettingsHolder settings) { }
9697
public void AddReceiveChannel(string address, string type = "http", int maxConcurrency = 1, bool isDefault = false) { }
9798
public void AddSite(string siteKey, string address, string type = "http", bool legacyMode = false) { }
9899
public void ChannelFactories(System.Func<string, NServiceBus.Gateway.IChannelSender> senderFactory, System.Func<string, NServiceBus.Gateway.IChannelReceiver> receiverFactory) { }
Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
1-
namespace NServiceBus.Gateway
2-
{
3-
using System;
4-
using Settings;
1+
namespace NServiceBus.Gateway;
2+
3+
using Settings;
54

5+
/// <summary>
6+
/// Configures the deduplication storage.
7+
/// </summary>
8+
public abstract class GatewayDeduplicationConfiguration
9+
{
610
/// <summary>
7-
/// Configures the deduplication storage.
11+
/// Called when the deduplication implementation should enable its feature.
812
/// </summary>
9-
public abstract class GatewayDeduplicationConfiguration
10-
{
11-
/// <summary>
12-
/// Invoked when the endpoint configuration completed to initialize the storage or verify configuration before the endpoint starts.
13-
/// </summary>
14-
public virtual void Setup(IReadOnlySettings settings)
15-
{
16-
}
17-
18-
/// <summary>
19-
/// Creates an instance of the deduplication storage.
20-
/// </summary>
21-
public abstract IGatewayDeduplicationStorage CreateStorage(IServiceProvider builder);
22-
}
13+
protected internal abstract void EnableFeature(SettingsHolder settings);
2314
}

src/NServiceBus.Gateway/Configuration/GatewayExtensions.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{
33
using System;
44
using Configuration.AdvancedExtensibility;
5+
using Features;
56
using Gateway;
67

78
/// <summary>
@@ -14,17 +15,21 @@ public static class GatewayExtensions
1415
/// </summary>
1516
/// <param name="config">The <see cref="EndpointConfiguration"/> instance to apply the settings to.</param>
1617
/// <param name="storageConfiguration">the storage configuration for the gateway's deduplication mechanism</param>
17-
public static GatewaySettings Gateway(this EndpointConfiguration config, GatewayDeduplicationConfiguration storageConfiguration)
18+
public static GatewaySettings Gateway<TGatewayDeduplicationConfiguration>(this EndpointConfiguration config, TGatewayDeduplicationConfiguration storageConfiguration)
19+
where TGatewayDeduplicationConfiguration : GatewayDeduplicationConfiguration
1820
{
1921
ArgumentNullException.ThrowIfNull(config);
2022
ArgumentNullException.ThrowIfNull(storageConfiguration);
2123

22-
config.EnableFeature<Features.Gateway>();
24+
var settings = config.GetSettings();
2325

24-
config.GetSettings().Set(storageConfiguration);
25-
config.GetSettings().SetDefault("Gateway.Retries.RetryPolicy", DefaultRetryPolicy.BuildWithDefaults());
26+
settings.EnableFeature<Features.Gateway>();
2627

27-
return new GatewaySettings(config);
28+
storageConfiguration.EnableFeature(settings);
29+
30+
settings.Set(storageConfiguration);
31+
32+
return new GatewaySettings(settings);
2833
}
2934
}
3035
}

src/NServiceBus.Gateway/Gateway.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ protected override void Setup(FeatureConfigurationContext context)
3535
throw new InvalidOperationException("Gateway is not supported for send only endpoints.");
3636
}
3737

38-
var storageConfiguration = context.Settings.Get<GatewayDeduplicationConfiguration>();
39-
storageConfiguration.Setup(context.Settings);
40-
4138
var transportDefinition = context.Settings.Get<TransportDefinition>();
4239

4340
ConfigureTransaction(context);
@@ -79,7 +76,7 @@ protected override void Setup(FeatureConfigurationContext context)
7976
channelReceiverFactory,
8077
GetEndpointRouter(context),
8178
b.GetRequiredService<IMessageDispatcher>(),
82-
storageConfiguration.CreateStorage(b),
79+
b.GetRequiredService<IGatewayDeduplicationStorage>(),
8380
b.GetServices<IClaimCheck>()?.FirstOrDefault(),
8481
b.GetRequiredService<ITransportAddressResolver>().ToTransportAddress(logicalGatewayAddress),
8582
transportDefinition.TransportTransactionMode));

src/NServiceBus.Gateway/NonDurableStorage/NonDurableDeduplicationConfiguration.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
namespace NServiceBus.Gateway
22
{
33
using System;
4+
using Features;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using Settings;
47

58
/// <summary>
69
/// Configuration class for the in-memory gateway deduplication storage.
@@ -21,6 +24,11 @@ public int CacheSize
2124
} = 10000;
2225

2326
/// <inheritdoc />
24-
public override IGatewayDeduplicationStorage CreateStorage(IServiceProvider builder) => new NonDurableDeduplicationStorage(CacheSize);
27+
protected internal override void EnableFeature(SettingsHolder settings) => settings.EnableFeature<NonDurableDeduplication>();
28+
29+
class NonDurableDeduplication : Feature
30+
{
31+
protected override void Setup(FeatureConfigurationContext context) => context.Services.AddSingleton<IGatewayDeduplicationStorage>(_ => new NonDurableDeduplicationStorage(context.Settings.Get<NonDurableDeduplicationConfiguration>().CacheSize));
32+
}
2533
}
2634
}

0 commit comments

Comments
 (0)