Skip to content

Commit 805faa7

Browse files
Refactor factories to use injectable delegates
1 parent e523c61 commit 805faa7

File tree

6 files changed

+48
-43
lines changed

6 files changed

+48
-43
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2+
3+
namespace Asp.Versioning.Builder;
4+
5+
/// <summary>
6+
/// Creates and returns a new API version set builder.
7+
/// </summary>
8+
/// <param name="name">The name of the API associated with the builder, if any.</param>
9+
/// <returns>A new <see cref="ApiVersionSetBuilder">API version set builder</see>.</returns>
10+
public delegate ApiVersionSetBuilder ApiVersionSetBuilderFactory( string? name = default );

src/AspNetCore/WebApi/src/Asp.Versioning.Http/Builder/DefaultApiVersionSetBuilderFactory.cs

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/AspNetCore/WebApi/src/Asp.Versioning.Http/Builder/IApiVersionSetBuilderFactory.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/AspNetCore/WebApi/src/Asp.Versioning.Http/Builder/IEndpointRouteBuilderExtensions.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ public static class IEndpointRouteBuilderExtensions
2727
throw new ArgumentNullException( nameof( endpoints ) );
2828
}
2929

30-
var factory = endpoints.ServiceProvider.GetRequiredService<IApiVersionSetBuilderFactory>();
30+
var create = endpoints.ServiceProvider.GetService<ApiVersionSetBuilderFactory>();
3131

32-
return factory.Create( name );
32+
return create is null ? new ApiVersionSetBuilder( name ) : create( name );
3333
}
3434

3535
/// <summary>
@@ -52,11 +52,9 @@ public static class IEndpointRouteBuilderExtensions
5252
throw new InvalidOperationException( SR.CannotNestVersionSet );
5353
}
5454

55-
var factory = builder.ServiceProvider.GetRequiredService<IApiVersionSetBuilderFactory>();
56-
5755
builder.Finally( EndpointBuilderFinalizer.FinalizeRoutes );
5856

59-
return new VersionedEndpointRouteBuilder( builder, builder, factory.Create( name ) );
57+
return builder.NewVersionedEndpointRouteBuilder( builder, builder, name );
6058
}
6159

6260
/// <summary>
@@ -79,11 +77,25 @@ public static class IEndpointRouteBuilderExtensions
7977

8078
var group = builder.MapGroup( string.Empty );
8179
IEndpointConventionBuilder convention = group;
82-
var factory = builder.ServiceProvider.GetRequiredService<IApiVersionSetBuilderFactory>();
8380

8481
convention.Finally( EndpointBuilderFinalizer.FinalizeRoutes );
8582

86-
return new VersionedEndpointRouteBuilder( group, group, factory.Create( name ) );
83+
return builder.NewVersionedEndpointRouteBuilder( group, group, name );
84+
}
85+
86+
[MethodImpl( MethodImplOptions.AggressiveInlining )]
87+
private static IVersionedEndpointRouteBuilder NewVersionedEndpointRouteBuilder(
88+
this IEndpointRouteBuilder builder,
89+
IEndpointRouteBuilder routeBuilder,
90+
IEndpointConventionBuilder conventionBuilder,
91+
string? name )
92+
{
93+
var create = builder.ServiceProvider.GetService<VersionedEndpointRouteBuilderFactory>();
94+
var versionSet = builder.NewApiVersionSet( name );
95+
96+
return create is null ?
97+
new VersionedEndpointRouteBuilder( routeBuilder, conventionBuilder, versionSet ) :
98+
create( routeBuilder, conventionBuilder, versionSet );
8799
}
88100

89101
[MethodImpl( MethodImplOptions.AggressiveInlining )]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2+
3+
namespace Asp.Versioning.Builder;
4+
5+
using Microsoft.AspNetCore.Builder;
6+
using Microsoft.AspNetCore.Routing;
7+
8+
/// <summary>
9+
/// Creates and returns a new versioned endpoint route builder.
10+
/// </summary>
11+
/// <param name="routeBuilder">The inner <see cref="IEndpointRouteBuilder"/> the new instance decorates.</param>
12+
/// <param name="conventionBuilder">The inner <see cref="IEndpointConventionBuilder"/> the new instance decorates.</param>
13+
/// <param name="apiVersionSetBuilder">The associated <see cref="ApiVersionSetBuilder">API version set builder</see>.</param>
14+
/// <returns>A new <see cref="IVersionedEndpointRouteBuilder"/> instance.</returns>
15+
[CLSCompliant( false )]
16+
public delegate IVersionedEndpointRouteBuilder VersionedEndpointRouteBuilderFactory(
17+
IEndpointRouteBuilder routeBuilder,
18+
IEndpointConventionBuilder conventionBuilder,
19+
ApiVersionSetBuilder apiVersionSetBuilder );

src/AspNetCore/WebApi/src/Asp.Versioning.Http/DependencyInjection/IServiceCollectionExtensions.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ private static void AddApiVersioningServices( IServiceCollection services )
8484
throw new ArgumentNullException( nameof( services ) );
8585
}
8686

87-
services.TryAddSingleton<IApiVersionSetBuilderFactory, DefaultApiVersionSetBuilderFactory>();
8887
services.TryAddSingleton<IApiVersionParser, ApiVersionParser>();
8988
services.Add( Singleton( sp => sp.GetRequiredService<IOptions<ApiVersioningOptions>>().Value.ApiVersionReader ) );
9089
services.Add( Singleton( sp => (IApiVersionParameterSource) sp.GetRequiredService<IOptions<ApiVersioningOptions>>().Value.ApiVersionReader ) );

0 commit comments

Comments
 (0)