Skip to content

Commit 7b53d0b

Browse files
authored
Make use of IValidateOptions<T> (#440)
This PR makes use of `services.ConfigureOptions<T>(...)` and `IValidateOptions<T>` to make configuration, post configuration and validation of options easier.
1 parent 5474474 commit 7b53d0b

File tree

26 files changed

+112
-97
lines changed

26 files changed

+112
-97
lines changed

src/Tingle.EventBus.Serializers.NewtonsoftJson/EventBusBuilderExtensions.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Microsoft.Extensions.Options;
2-
using Tingle.EventBus.Serializers;
1+
using Tingle.EventBus.Serializers;
32

43
namespace Microsoft.Extensions.DependencyInjection;
54

@@ -22,7 +21,7 @@ public static EventBusBuilder UseDefaultNewtonsoftJsonSerializer(this EventBusBu
2221
// Configure the options for the serializer
2322
var services = builder.Services;
2423
if (configure != null) services.Configure(configure);
25-
services.AddSingleton<IPostConfigureOptions<NewtonsoftJsonSerializerOptions>, NewtonsoftJsonSerializerPostConfigureOptions>();
24+
services.ConfigureOptions<NewtonsoftJsonSerializerConfigureOptions>();
2625

2726
// Add the serializer
2827
return builder.UseDefaultSerializer<NewtonsoftJsonSerializer>();

src/Tingle.EventBus.Serializers.NewtonsoftJson/NewtonsoftJsonSerializerPostConfigureOptions.cs renamed to src/Tingle.EventBus.Serializers.NewtonsoftJson/NewtonsoftJsonSerializerConfigureOptions.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ namespace Microsoft.Extensions.DependencyInjection;
66
/// <summary>
77
/// A class to finish the configuration of instances of <see cref="NewtonsoftJsonSerializerOptions"/>.
88
/// </summary>
9-
internal class NewtonsoftJsonSerializerPostConfigureOptions : IPostConfigureOptions<NewtonsoftJsonSerializerOptions>
9+
internal class NewtonsoftJsonSerializerConfigureOptions : IValidateOptions<NewtonsoftJsonSerializerOptions>
1010
{
11-
public void PostConfigure(string name, NewtonsoftJsonSerializerOptions options)
11+
public ValidateOptionsResult Validate(string name, NewtonsoftJsonSerializerOptions options)
1212
{
1313
// Ensure the settings are provided
1414
if (options.SerializerSettings == null)
1515
{
16-
throw new InvalidOperationException($"'{nameof(options.SerializerSettings)}' must be provided");
16+
return ValidateOptionsResult.Fail($"'{nameof(options.SerializerSettings)}' must be provided");
1717
}
18+
19+
return ValidateOptionsResult.Success;
1820
}
1921
}

src/Tingle.EventBus.Transports.Amazon.Abstractions/AmazonTransportPostConfigureOptions.cs renamed to src/Tingle.EventBus.Transports.Amazon.Abstractions/AmazonTransportConfigureOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace Microsoft.Extensions.DependencyInjection;
77
/// <summary>
88
/// A class to finish the configuration of instances of <see cref="AmazonTransportOptions"/> derivatives.
99
/// </summary>
10-
public abstract class AmazonTransportPostConfigureOptions<TOptions> : IPostConfigureOptions<TOptions> where TOptions : AmazonTransportOptions
10+
public abstract class AmazonTransportConfigureOptions<TOptions> : IPostConfigureOptions<TOptions> where TOptions : AmazonTransportOptions
1111
{
1212
/// <inheritdoc/>
1313
public virtual void PostConfigure(string name, TOptions options)

src/Tingle.EventBus.Transports.Amazon.Kinesis/AmazonKinesisPostConfigureOptions.cs renamed to src/Tingle.EventBus.Transports.Amazon.Kinesis/AmazonKinesisConfigureOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ namespace Microsoft.Extensions.DependencyInjection;
88
/// <summary>
99
/// A class to finish the configuration of instances of <see cref="AmazonKinesisTransportOptions"/>.
1010
/// </summary>
11-
internal class AmazonKinesisPostConfigureOptions : AmazonTransportPostConfigureOptions<AmazonKinesisTransportOptions>
11+
internal class AmazonKinesisConfigureOptions : AmazonTransportConfigureOptions<AmazonKinesisTransportOptions>
1212
{
1313
private readonly EventBusOptions busOptions;
1414

15-
public AmazonKinesisPostConfigureOptions(IOptions<EventBusOptions> busOptionsAccessor)
15+
public AmazonKinesisConfigureOptions(IOptions<EventBusOptions> busOptionsAccessor)
1616
{
1717
busOptions = busOptionsAccessor?.Value ?? throw new ArgumentNullException(nameof(busOptionsAccessor));
1818
}

src/Tingle.EventBus.Transports.Amazon.Kinesis/EventBusBuilderExtensions.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Microsoft.Extensions.Options;
2-
using Tingle.EventBus.Transports.Amazon.Kinesis;
1+
using Tingle.EventBus.Transports.Amazon.Kinesis;
32

43
namespace Microsoft.Extensions.DependencyInjection;
54

@@ -23,7 +22,7 @@ public static EventBusBuilder AddAmazonKinesisTransport(this EventBusBuilder bui
2322

2423
// Configure the options for Amazon Kinesis
2524
services.Configure(configure);
26-
services.AddSingleton<IPostConfigureOptions<AmazonKinesisTransportOptions>, AmazonKinesisPostConfigureOptions>();
25+
services.ConfigureOptions<AmazonKinesisConfigureOptions>();
2726

2827
// Register the transport
2928
builder.AddTransport<AmazonKinesisTransport, AmazonKinesisTransportOptions>();

src/Tingle.EventBus.Transports.Amazon.Sqs/AmazonSqsPostConfigureOptions.cs renamed to src/Tingle.EventBus.Transports.Amazon.Sqs/AmazonSqsConfigureOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ namespace Microsoft.Extensions.DependencyInjection;
99
/// <summary>
1010
/// A class to finish the configuration of instances of <see cref="AmazonSqsTransportOptions"/>.
1111
/// </summary>
12-
internal class AmazonSqsPostConfigureOptions : AmazonTransportPostConfigureOptions<AmazonSqsTransportOptions>
12+
internal class AmazonSqsConfigureOptions : AmazonTransportConfigureOptions<AmazonSqsTransportOptions>
1313
{
1414
private readonly EventBusOptions busOptions;
1515

16-
public AmazonSqsPostConfigureOptions(IOptions<EventBusOptions> busOptionsAccessor)
16+
public AmazonSqsConfigureOptions(IOptions<EventBusOptions> busOptionsAccessor)
1717
{
1818
busOptions = busOptionsAccessor?.Value ?? throw new ArgumentNullException(nameof(busOptionsAccessor));
1919
}

src/Tingle.EventBus.Transports.Amazon.Sqs/EventBusBuilderExtensions.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Microsoft.Extensions.Options;
2-
using Tingle.EventBus.Transports.Amazon.Sqs;
1+
using Tingle.EventBus.Transports.Amazon.Sqs;
32

43
namespace Microsoft.Extensions.DependencyInjection;
54

@@ -23,7 +22,7 @@ public static EventBusBuilder AddAmazonSqsTransport(this EventBusBuilder builder
2322

2423
// configure the options for Amazon SQS and SNS option
2524
services.Configure(configure);
26-
services.AddSingleton<IPostConfigureOptions<AmazonSqsTransportOptions>, AmazonSqsPostConfigureOptions>();
25+
services.ConfigureOptions<AmazonSqsConfigureOptions>();
2726

2827
// register the transport
2928
builder.AddTransport<AmazonSqsTransport, AmazonSqsTransportOptions>();

src/Tingle.EventBus.Transports.Azure.Abstractions/AzureTransportPostConfigureOptions.cs renamed to src/Tingle.EventBus.Transports.Azure.Abstractions/AzureTransportConfigureOptions.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,31 @@ namespace Microsoft.Extensions.DependencyInjection;
55
/// <summary>
66
/// A class to finish the configuration of instances of <see cref="AzureTransportOptions{TCredential}"/> derivatives.
77
/// </summary>
8-
public abstract class AzureTransportPostConfigureOptions<TCredential, TOptions> : IPostConfigureOptions<TOptions>
8+
public abstract class AzureTransportConfigureOptions<TCredential, TOptions> : IPostConfigureOptions<TOptions>, IValidateOptions<TOptions>
99
where TCredential : AzureTransportCredentials
1010
where TOptions : AzureTransportOptions<TCredential>
1111
{
1212
/// <inheritdoc/>
1313
public virtual void PostConfigure(string name, TOptions options)
14+
{
15+
// intentionally left bank for future use
16+
}
17+
18+
/// <inheritdoc/>
19+
public virtual ValidateOptionsResult Validate(string name, TOptions options)
1420
{
1521
// We should either have a token credential or a connection string
1622
if (options.Credentials is null || options.Credentials.Value is null)
1723
{
18-
throw new InvalidOperationException($"'{nameof(options.Credentials)}' must be provided in form a connection string or an instance of '{typeof(TCredential).Name}'.");
24+
return ValidateOptionsResult.Fail($"'{nameof(options.Credentials)}' must be provided in form a connection string or an instance of '{typeof(TCredential).Name}'.");
1925
}
2026

2127
// We must have TokenCredential if using TCredential
2228
if (options.Credentials.Value is TCredential tc && tc.TokenCredential is null)
2329
{
24-
throw new InvalidOperationException($"'{nameof(tc.TokenCredential)}' must be provided when using '{typeof(TCredential).Name}'.");
30+
return ValidateOptionsResult.Fail($"'{nameof(tc.TokenCredential)}' must be provided when using '{typeof(TCredential).Name}'.");
2531
}
32+
33+
return ValidateOptionsResult.Success;
2634
}
2735
}

src/Tingle.EventBus.Transports.Azure.EventHubs/AzureEventHubsPostConfigureOptions.cs renamed to src/Tingle.EventBus.Transports.Azure.EventHubs/AzureEventHubsConfigureOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ namespace Microsoft.Extensions.DependencyInjection;
77
/// <summary>
88
/// A class to finish the configuration of instances of <see cref="AzureEventHubsTransportOptions"/>.
99
/// </summary>
10-
internal class AzureEventHubsPostConfigureOptions : AzureTransportPostConfigureOptions<AzureEventHubsTransportCredentials, AzureEventHubsTransportOptions>
10+
internal class AzureEventHubsConfigureOptions : AzureTransportConfigureOptions<AzureEventHubsTransportCredentials, AzureEventHubsTransportOptions>
1111
{
1212
private readonly EventBusOptions busOptions;
1313

14-
public AzureEventHubsPostConfigureOptions(IOptions<EventBusOptions> busOptionsAccessor)
14+
public AzureEventHubsConfigureOptions(IOptions<EventBusOptions> busOptionsAccessor)
1515
{
1616
busOptions = busOptionsAccessor?.Value ?? throw new ArgumentNullException(nameof(busOptionsAccessor));
1717
}

src/Tingle.EventBus.Transports.Azure.EventHubs/EventBusBuilderExtensions.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Microsoft.Extensions.Options;
2-
using Tingle.EventBus.Transports.Azure.EventHubs;
1+
using Tingle.EventBus.Transports.Azure.EventHubs;
32

43
namespace Microsoft.Extensions.DependencyInjection;
54

@@ -23,7 +22,7 @@ public static EventBusBuilder AddAzureEventHubsTransport(this EventBusBuilder bu
2322

2423
// configure the options for Azure Event Hubs
2524
services.Configure(configure);
26-
services.AddSingleton<IPostConfigureOptions<AzureEventHubsTransportOptions>, AzureEventHubsPostConfigureOptions>();
25+
services.ConfigureOptions<AzureEventHubsConfigureOptions>();
2726

2827
// register the transport
2928
builder.AddTransport<AzureEventHubsTransport, AzureEventHubsTransportOptions>();

0 commit comments

Comments
 (0)