Skip to content

Commit 1df603a

Browse files
Chris Martinezcommonsensesoftware
Chris Martinez
authored andcommitted
Initial refactoring to support type interleaving and action-level API versions
1 parent ea48ea5 commit 1df603a

File tree

105 files changed

+1861
-3109
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+1861
-3109
lines changed

samples/webapi/SwaggerODataWebApiSample/Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void Configuration( IAppBuilder builder )
5151
};
5252
var models = modelBuilder.GetEdmModels();
5353

54-
// TODO: while you can use both, you should choose only ONE of the following; comment, uncomment, or remove as necessary
54+
// INFO: while you can use both, you should choose only ONE of the following; comment, uncomment, or remove as necessary
5555

5656
// WHEN VERSIONING BY: query string, header, or media type
5757
configuration.MapVersionedODataRoutes( "odata", routePrefix, models, ConfigureContainer );

src/Common/AdvertiseApiVersionsAttribute.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ namespace Microsoft.AspNetCore.Mvc
1818
/// </summary>
1919
/// <remarks>Advertised service API versions indicate the existence of other versioned services, but the implementation of those
2020
/// services are implemented elsewhere.</remarks>
21-
[AttributeUsage( Class, AllowMultiple = true, Inherited = false )]
21+
[AttributeUsage( Class | Method, AllowMultiple = true, Inherited = false )]
2222
[SuppressMessage( "Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments", Justification = "An accessor property is provided, but the values are typed; not strings." )]
2323
[SuppressMessage( "Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "Allows extensibility." )]
24-
public partial class AdvertiseApiVersionsAttribute : ApiVersionsBaseAttribute, IApiVersionProvider
24+
public class AdvertiseApiVersionsAttribute : ApiVersionsBaseAttribute, IApiVersionProvider
2525
{
26+
ApiVersionProviderOptions options = ApiVersionProviderOptions.Advertised;
27+
2628
/// <summary>
2729
/// Initializes a new instance of the <see cref="AdvertiseApiVersionsAttribute"/> class.
2830
/// </summary>
@@ -49,15 +51,29 @@ public AdvertiseApiVersionsAttribute( string version ) : base( version ) { }
4951
public AdvertiseApiVersionsAttribute( params string[] versions ) : base( versions ) { }
5052

5153
#pragma warning disable CA1033 // Interface methods should be callable by child types
52-
bool IApiVersionProvider.AdvertiseOnly => true;
54+
ApiVersionProviderOptions IApiVersionProvider.Options => options;
5355
#pragma warning restore CA1033 // Interface methods should be callable by child types
5456

5557
/// <summary>
5658
/// Gets or sets a value indicating whether the specified set of API versions are deprecated.
5759
/// </summary>
5860
/// <value>True if the specified set of API versions are deprecated; otherwise, false.
5961
/// The default value is <c>false</c>.</value>
60-
public bool Deprecated { get; set; }
62+
public bool Deprecated
63+
{
64+
get => ( options & ApiVersionProviderOptions.Deprecated ) == ApiVersionProviderOptions.Deprecated;
65+
set
66+
{
67+
if ( value )
68+
{
69+
options |= ApiVersionProviderOptions.Deprecated;
70+
}
71+
else
72+
{
73+
options &= ~ApiVersionProviderOptions.Deprecated;
74+
}
75+
}
76+
}
6177

6278
/// <summary>
6379
/// Returns a hash code for the current instance.

src/Common/ApiVersionAttribute.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ namespace Microsoft.AspNetCore.Mvc
1616
/// <summary>
1717
/// Represents the metadata that describes the <see cref="ApiVersion">API versions</see> associated with a service.
1818
/// </summary>
19-
[AttributeUsage( Class, AllowMultiple = true, Inherited = false )]
19+
[AttributeUsage( Class | Method, AllowMultiple = true, Inherited = false )]
2020
[SuppressMessage( "Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments", Justification = "An accessor property is provided, but the values are typed; not strings." )]
2121
[SuppressMessage( "Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "Allows extensibility." )]
22-
public partial class ApiVersionAttribute : ApiVersionsBaseAttribute, IApiVersionProvider
22+
public class ApiVersionAttribute : ApiVersionsBaseAttribute, IApiVersionProvider
2323
{
24+
ApiVersionProviderOptions options = ApiVersionProviderOptions.None;
25+
2426
/// <summary>
2527
/// Initializes a new instance of the <see cref="ApiVersionAttribute"/> class.
2628
/// </summary>
@@ -34,15 +36,29 @@ protected ApiVersionAttribute( ApiVersion version ) : base( version ) { }
3436
public ApiVersionAttribute( string version ) : base( version ) { }
3537

3638
#pragma warning disable CA1033 // Interface methods should be callable by child types
37-
bool IApiVersionProvider.AdvertiseOnly => false;
39+
ApiVersionProviderOptions IApiVersionProvider.Options => options;
3840
#pragma warning restore CA1033 // Interface methods should be callable by child types
3941

4042
/// <summary>
4143
/// Gets or sets a value indicating whether the specified set of API versions are deprecated.
4244
/// </summary>
4345
/// <value>True if the specified set of API versions are deprecated; otherwise, false.
4446
/// The default value is <c>false</c>.</value>
45-
public bool Deprecated { get; set; }
47+
public bool Deprecated
48+
{
49+
get => ( options & ApiVersionProviderOptions.Deprecated ) == ApiVersionProviderOptions.Deprecated;
50+
set
51+
{
52+
if ( value )
53+
{
54+
options |= ApiVersionProviderOptions.Deprecated;
55+
}
56+
else
57+
{
58+
options &= ~ApiVersionProviderOptions.Deprecated;
59+
}
60+
}
61+
}
4662

4763
/// <summary>
4864
/// Returns a hash code for the current instance.

src/Common/ApiVersionNeutralAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Mvc
1515
/// <summary>
1616
/// Represents the metadata to indicate a service is API version neutral.
1717
/// </summary>
18-
[AttributeUsage( Class, AllowMultiple = false, Inherited = true )]
18+
[AttributeUsage( Class | Method, AllowMultiple = false, Inherited = true )]
1919
public sealed class ApiVersionNeutralAttribute : Attribute, IApiVersionNeutral
2020
{
2121
}

src/Common/CollectionExtensions.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,26 @@ internal static string EnsureZeroOrOneApiVersions( this ICollection<string> apiV
7676

7777
throw new AmbiguousApiVersionException( message, apiVersions.OrderBy( v => v ) );
7878
}
79+
80+
internal static void UnionWith<T>( this ICollection<T> collection, IEnumerable<T> other )
81+
{
82+
Contract.Requires( collection != null );
83+
Contract.Requires( other != null );
84+
85+
if ( collection is ISet<T> set )
86+
{
87+
set.UnionWith( other );
88+
}
89+
else
90+
{
91+
foreach ( var item in other )
92+
{
93+
if ( !collection.Contains( item ) )
94+
{
95+
collection.Add( item );
96+
}
97+
}
98+
}
99+
}
79100
}
80101
}

src/Common/Common.projitems

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,33 +22,33 @@
2222
<Compile Include="$(MSBuildThisFileDirectory)Versioning\AmbiguousApiVersionException.cs" />
2323
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionFormatProvider.cs" />
2424
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersioningOptions.cs" />
25+
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionMapping.cs" />
2526
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionModel.cs" />
2627
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionModelDebugView.cs" />
2728
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionModelExtensions.cs" />
2829
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionParameterLocation.cs" />
30+
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionProviderOptions.cs" />
2931
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionReader.cs" />
3032
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ApiVersionsBaseAttribute.cs" />
31-
<Compile Include="$(MSBuildThisFileDirectory)Versioning\AttributeExtensions.cs" />
3233
<Compile Include="$(MSBuildThisFileDirectory)Versioning\ConstantApiVersionSelector.cs" />
34+
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilderBase.cs" />
3335
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilderCollection.cs" />
3436
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilderCollection{T}.cs" />
35-
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilderBase.cs" />
3637
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilder.cs" />
3738
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilder{T}.cs" />
3839
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilderExtensions.cs" />
3940
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionApiVersionConventionBuilderTExtensions.cs" />
4041
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ActionConventionBuilderExtensions.cs" />
4142
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ApiVersionConventionBuilder.cs" />
42-
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ControllerApiVersionConventionBuilderBase.cs" />
43+
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ApiVersionConventionBuilderBase.cs" />
4344
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ControllerApiVersionConventionBuilder.cs" />
4445
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ControllerApiVersionConventionBuilder{T}.cs" />
45-
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ControllerApiVersionConventionBuilderExtensions.cs" />
46-
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ControllerApiVersionConventionBuilderTExtensions.cs" />
4746
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\ExpressionExtensions.cs" />
4847
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\IActionConventionBuilder.cs" />
4948
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\IActionConventionBuilder{T}.cs" />
49+
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\IApiVersionConventionBuilderExtensions.cs" />
5050
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\IApiVersionConvention{T}.cs" />
51-
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\IControllerConventionBuilder.cs" />
51+
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\IApiVersionConventionBuilder.cs" />
5252
<Compile Include="$(MSBuildThisFileDirectory)Versioning\Conventions\VersionByNamespaceConvention.cs" />
5353
<Compile Include="$(MSBuildThisFileDirectory)Versioning\CurrentImplementationApiVersionSelector.cs" />
5454
<Compile Include="$(MSBuildThisFileDirectory)Versioning\DefaultApiVersionReporter.cs" />

src/Common/MapToApiVersionAttribute.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ namespace Microsoft.AspNetCore.Mvc
1616
/// <summary>
1717
/// Represents the metadata that describes the <see cref="ApiVersion">API version</see>-specific implementation of a service.
1818
/// </summary>
19+
#if !WEBAPI
20+
[CLSCompliant( false )]
21+
#endif
1922
[AttributeUsage( Method, AllowMultiple = true, Inherited = false )]
2023
[SuppressMessage( "Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments", Justification = "An accessor property is provided, but the values are typed; not strings." )]
2124
[SuppressMessage( "Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "Allows extensibility." )]
22-
public partial class MapToApiVersionAttribute : ApiVersionsBaseAttribute, IApiVersionProvider
25+
public class MapToApiVersionAttribute : ApiVersionsBaseAttribute, IApiVersionProvider
2326
{
2427
/// <summary>
2528
/// Initializes a new instance of the <see cref="MapToApiVersionAttribute"/> class.
@@ -34,9 +37,7 @@ protected MapToApiVersionAttribute( ApiVersion version ) : base( version ) { }
3437
public MapToApiVersionAttribute( string version ) : base( version ) { }
3538

3639
#pragma warning disable CA1033 // Interface methods should be callable by child types
37-
bool IApiVersionProvider.AdvertiseOnly => false;
38-
39-
bool IApiVersionProvider.Deprecated => false;
40+
ApiVersionProviderOptions IApiVersionProvider.Options => ApiVersionProviderOptions.Mapped;
4041
#pragma warning restore CA1033 // Interface methods should be callable by child types
4142
}
4243
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#if WEBAPI
2+
namespace Microsoft.Web.Http.Versioning
3+
#else
4+
namespace Microsoft.AspNetCore.Mvc.Versioning
5+
#endif
6+
{
7+
using System;
8+
9+
/// <summary>
10+
/// Represents the possible types of API version mappings.
11+
/// </summary>
12+
public enum ApiVersionMapping
13+
{
14+
/// <summary>
15+
/// Indicates no mapping.
16+
/// </summary>
17+
None,
18+
19+
/// <summary>
20+
/// Indicates an explicit mapping.
21+
/// </summary>
22+
Explicit,
23+
24+
/// <summary>
25+
/// Indicates an implicit mapping.
26+
/// </summary>
27+
Implicit,
28+
}
29+
}

0 commit comments

Comments
 (0)