diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index 048f3fa8a..aad538aa1 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -193,3 +193,12 @@ var builder = Host.CreateApplicationBuilder(); builder.ConfigureContainer(new LamarServiceProviderFactory()); ``` +## Splitting Configuration Across Modules + +To keep your `UseWolverine()` configuration from becoming too huge or to keep specific configuration maybe +within different modules within your system, you can use [Wolverine extensions](/guide/extensions). + +You can also use the `IServiceCollection.ConfigureWolverine()` method to add configuration to your +Wolverine application from outside the main `UseWolverine()` code as shown below: + +snippet: sample_using_configure_wolverine \ No newline at end of file diff --git a/src/Testing/CoreTests/Configuration/using_configure_wolverine.cs b/src/Testing/CoreTests/Configuration/using_configure_wolverine.cs new file mode 100644 index 000000000..9a7c50aa0 --- /dev/null +++ b/src/Testing/CoreTests/Configuration/using_configure_wolverine.cs @@ -0,0 +1,42 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using NSubstitute.Extensions; +using Wolverine.Runtime; +using Xunit; + +namespace CoreTests.Configuration; + +public class using_configure_wolverine +{ + [Fact] + public async Task use_configure_wolverine() + { + #region sample_using_configure_wolverine + + var builder = Host.CreateApplicationBuilder(); + + // Baseline Wolverine configuration + builder.Services.AddWolverine(opts => + { + + }); + + // This would be applied as an extension + builder.Services.ConfigureWolverine(w => + { + // There is a specific helper for this, but just go for it + // as an easy example + w.Durability.Mode = DurabilityMode.Solo; + }); + + using var host = builder.Build(); + + host.Services.GetRequiredService() + .Options + .Durability + .Mode + .ShouldBe(DurabilityMode.Solo); + + #endregion + } +} \ No newline at end of file diff --git a/src/Wolverine/HostBuilderExtensions.cs b/src/Wolverine/HostBuilderExtensions.cs index 67627693c..42a96658d 100644 --- a/src/Wolverine/HostBuilderExtensions.cs +++ b/src/Wolverine/HostBuilderExtensions.cs @@ -416,6 +416,22 @@ public static IServiceCollection UseWolverineSoloMode(this IServiceCollection se return services; } + /// + /// Apply either overrides or additional configuration to Wolverine in this application + /// Useful for testing overrides or for splitting configuration between modules + /// + /// + /// + /// + public static IServiceCollection ConfigureWolverine(this IServiceCollection services, + Action configure) + { + var extension = new LambdaWolverineExtension(configure); + services.AddSingleton(extension); + + return services; + } + internal class UseSoloDurabilityMode : IWolverineExtension { public void Configure(WolverineOptions options) diff --git a/src/Wolverine/IWolverineExtension.cs b/src/Wolverine/IWolverineExtension.cs index 3f0a346b8..a365af7e2 100644 --- a/src/Wolverine/IWolverineExtension.cs +++ b/src/Wolverine/IWolverineExtension.cs @@ -24,3 +24,18 @@ public interface IAsyncWolverineExtension { ValueTask Configure(WolverineOptions options); } + +internal class LambdaWolverineExtension : IWolverineExtension +{ + private readonly Action _action; + + public LambdaWolverineExtension(Action action) + { + _action = action ?? throw new ArgumentNullException(nameof(action)); + } + + public void Configure(WolverineOptions options) + { + _action(options); + } +}