Skip to content

Commit 61fd62f

Browse files
Chris Martinezcommonsensesoftware
authored andcommitted
Added support to retrieve EDM model by API version
1 parent 0df0b58 commit 61fd62f

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

src/Microsoft.AspNet.OData.Versioning/System.Web.Http/HttpConfigurationExtensions.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,5 +768,52 @@ static IContainerBuilder CreateContainerBuilderWithDefaultServices( this HttpCon
768768

769769
return builder;
770770
}
771+
772+
/// <summary>
773+
/// Gets the configured entity data model (EDM) for the specified API version.
774+
/// </summary>
775+
/// <param name="configuration">The server configuration.</param>
776+
/// <param name="apiVersion">The <see cref="ApiVersion">API version</see> to get the model for.</param>
777+
/// <returns>The matching <see cref="IEdmModel">EDM model</see> or <c>null</c>.</returns>
778+
public static IEdmModel GetEdmModel( this HttpConfiguration configuration, ApiVersion apiVersion )
779+
{
780+
Arg.NotNull( configuration, nameof( configuration ) );
781+
Arg.NotNull( apiVersion, nameof( apiVersion ) );
782+
783+
var allRoutes = configuration.Routes;
784+
var routes = new KeyValuePair<string, IHttpRoute>[allRoutes.Count];
785+
var containers = configuration.GetRootContainerMappings();
786+
787+
allRoutes.CopyTo( routes, 0 );
788+
789+
foreach ( var route in routes )
790+
{
791+
if ( !( route.Value is ODataRoute odataRoute ) )
792+
{
793+
continue;
794+
}
795+
796+
if ( !containers.TryGetValue( route.Key, out var serviceProvider ) )
797+
{
798+
continue;
799+
}
800+
801+
var model = serviceProvider.GetService<IEdmModel>();
802+
803+
if ( model?.EntityContainer == null )
804+
{
805+
continue;
806+
}
807+
808+
var modelApiVersion = model.GetAnnotationValue<ApiVersionAnnotation>( model )?.ApiVersion;
809+
810+
if ( modelApiVersion == apiVersion )
811+
{
812+
return model;
813+
}
814+
}
815+
816+
return null;
817+
}
771818
}
772819
}

src/Microsoft.AspNet.OData.Versioning/System.Web.Http/IContainerBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
using System.Web.OData.Routing.Conventions;
1313
using static Microsoft.OData.ServiceLifetime;
1414

15-
internal static class IContainerBuilderExtensions
15+
static class IContainerBuilderExtensions
1616
{
1717
internal static void InitializeAttributeRouting( this IServiceProvider serviceProvider ) => serviceProvider.GetServices<IODataRoutingConvention>();
1818

test/Microsoft.AspNet.OData.Versioning.Tests/System.Web.OData/HttpConfigurationExtensionsTest.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,25 @@ public void map_versioned_odata_routes_should_return_expected_results()
9696
batchRoute.RouteTemplate.Should().Be( "api/$batch" );
9797
}
9898

99+
[Theory]
100+
[InlineData( 0, "1.0" )]
101+
[InlineData( 1, "2.0" )]
102+
public void get_edm_model_should_retrieve_configured_model_by_api_version( int modelIndex, string apiVersionValue )
103+
{
104+
// arrange
105+
var apiVersion = ApiVersion.Parse( apiVersionValue );
106+
var configuration = new HttpConfiguration();
107+
var models = CreateModels( configuration ).ToArray();
108+
109+
configuration.MapVersionedODataRoutes( "odata", "api", models );
110+
111+
// act
112+
var model = configuration.GetEdmModel( apiVersion );
113+
114+
// assert
115+
model.Should().BeSameAs( models[modelIndex] );
116+
}
117+
99118
static IEnumerable<IEdmModel> CreateModels( HttpConfiguration configuration )
100119
{
101120
var controllerTypeResolver = new Mock<IHttpControllerTypeResolver>();

0 commit comments

Comments
 (0)