diff options
author | Stephen Halter <halter73@gmail.com> | 2021-02-09 22:32:13 +0300 |
---|---|---|
committer | Stephen Halter <halter73@gmail.com> | 2021-02-09 22:32:13 +0300 |
commit | 64ed5037a214599c61656f7dc970e84ac0d08d8c (patch) | |
tree | 6017cf57e82f8935b31be99dc390b91128fc28ab | |
parent | b0afb378baf9e963564d90351b6393442f144594 (diff) |
Move IRouteTemplateProvider backhalter73/29684-rebase
-rw-r--r-- | src/Http/Routing/src/Builder/MapActionEndpointRouteBuilderExtensions.cs | 15 | ||||
-rw-r--r-- | src/Http/Routing/src/IRouteOrderMetadata.cs | 19 | ||||
-rw-r--r-- | src/Http/Routing/src/IRoutePatternMetadata.cs | 16 | ||||
-rw-r--r-- | src/Http/Routing/src/PublicAPI.Unshipped.txt | 8 | ||||
-rw-r--r-- | src/Http/Routing/test/FunctionalTests/MapActionTest.cs | 28 | ||||
-rw-r--r-- | src/Http/Routing/test/UnitTests/Builder/MapActionEndpointRouteBuilderExtensionsTest.cs | 28 | ||||
-rw-r--r-- | src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt | 8 | ||||
-rw-r--r-- | src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt | 4 | ||||
-rw-r--r-- | src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs (renamed from src/Http/Routing/src/IRouteTemplateProvider.cs) | 13 |
9 files changed, 95 insertions, 44 deletions
diff --git a/src/Http/Routing/src/Builder/MapActionEndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/Builder/MapActionEndpointRouteBuilderExtensions.cs index 2b3edefff0..2468333ffa 100644 --- a/src/Http/Routing/src/Builder/MapActionEndpointRouteBuilderExtensions.cs +++ b/src/Http/Routing/src/Builder/MapActionEndpointRouteBuilderExtensions.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; -using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; namespace Microsoft.AspNetCore.Builder @@ -37,19 +36,22 @@ namespace Microsoft.AspNetCore.Builder var requestDelegate = MapActionExpressionTreeBuilder.BuildRequestDelegate(action); - var routeAttributes = action.Method.GetCustomAttributes().OfType<IRouteTemplateProvider>(); + var routeAttributes = action.Method.GetCustomAttributes().OfType<IRoutePatternMetadata>(); var conventionBuilders = new List<IEndpointConventionBuilder>(); const int defaultOrder = 0; foreach (var routeAttribute in routeAttributes) { - if (routeAttribute.Template is null) + if (routeAttribute.RoutePattern is not string pattern) { continue; } - var conventionBuilder = endpoints.Map(routeAttribute.Template, requestDelegate); + var routeName = (routeAttribute as IRouteNameMetadata)?.RouteName; + var routeOrder = (routeAttribute as IRouteOrderMetadata)?.RouteOrder; + + var conventionBuilder = endpoints.Map(pattern, requestDelegate); conventionBuilder.Add(endpointBuilder => { @@ -58,9 +60,10 @@ namespace Microsoft.AspNetCore.Builder endpointBuilder.Metadata.Add(attribute); } - endpointBuilder.DisplayName = routeAttribute.Name ?? routeAttribute.Template; - ((RouteEndpointBuilder)endpointBuilder).Order = routeAttribute.Order ?? defaultOrder; + endpointBuilder.DisplayName = routeName ?? pattern; + + ((RouteEndpointBuilder)endpointBuilder).Order = routeOrder ?? defaultOrder; }); conventionBuilders.Add(conventionBuilder); diff --git a/src/Http/Routing/src/IRouteOrderMetadata.cs b/src/Http/Routing/src/IRouteOrderMetadata.cs new file mode 100644 index 0000000000..4326b24e56 --- /dev/null +++ b/src/Http/Routing/src/IRouteOrderMetadata.cs @@ -0,0 +1,19 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Routing +{ + /// <summary> + /// Interface for attributes which can supply a route order for attribute routing. + /// </summary> + public interface IRouteOrderMetadata + { + /// <summary> + /// Gets the route order. The order determines the order of route execution. Routes with a lower + /// order value are tried first. When a route doesn't specify a value, it gets a default value of 0. + /// A null value for the Order property means that the user didn't specify an explicit order for the + /// route. + /// </summary> + int? RouteOrder { get; } + } +} diff --git a/src/Http/Routing/src/IRoutePatternMetadata.cs b/src/Http/Routing/src/IRoutePatternMetadata.cs new file mode 100644 index 0000000000..615a67abfb --- /dev/null +++ b/src/Http/Routing/src/IRoutePatternMetadata.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Routing +{ + /// <summary> + /// Interface for attributes which can supply a route pattern for attribute routing. + /// </summary> + public interface IRoutePatternMetadata + { + /// <summary> + /// The route pattern. May be <see langword="null"/>. + /// </summary> + string? RoutePattern { get; } + } +} diff --git a/src/Http/Routing/src/PublicAPI.Unshipped.txt b/src/Http/Routing/src/PublicAPI.Unshipped.txt index 2fedcc9837..3e12f6cb1a 100644 --- a/src/Http/Routing/src/PublicAPI.Unshipped.txt +++ b/src/Http/Routing/src/PublicAPI.Unshipped.txt @@ -6,14 +6,14 @@ *REMOVED*Microsoft.AspNetCore.Routing.RouteNameMetadata.RouteName.get -> string! *REMOVED*Microsoft.AspNetCore.Routing.RouteNameMetadata.RouteNameMetadata(string! routeName) -> void Microsoft.AspNetCore.Builder.MapActionEndpointRouteBuilderExtensions -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Name.get -> string? -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Order.get -> int? -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Template.get -> string? Microsoft.AspNetCore.Routing.DataTokensMetadata.DataTokens.get -> System.Collections.Generic.IReadOnlyDictionary<string!, object?>! Microsoft.AspNetCore.Routing.DataTokensMetadata.DataTokensMetadata(System.Collections.Generic.IReadOnlyDictionary<string!, object?>! dataTokens) -> void Microsoft.AspNetCore.Routing.IDataTokensMetadata.DataTokens.get -> System.Collections.Generic.IReadOnlyDictionary<string!, object?>! Microsoft.AspNetCore.Routing.IRouteNameMetadata.RouteName.get -> string? +Microsoft.AspNetCore.Routing.IRouteOrderMetadata +Microsoft.AspNetCore.Routing.IRouteOrderMetadata.RouteOrder.get -> int? +Microsoft.AspNetCore.Routing.IRoutePatternMetadata +Microsoft.AspNetCore.Routing.IRoutePatternMetadata.RoutePattern.get -> string? Microsoft.AspNetCore.Routing.RouteNameMetadata.RouteName.get -> string? Microsoft.AspNetCore.Routing.RouteNameMetadata.RouteNameMetadata(string? routeName) -> void static Microsoft.AspNetCore.Builder.MapActionEndpointRouteBuilderExtensions.MapAction(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder! endpoints, System.Delegate! action) -> Microsoft.AspNetCore.Builder.IEndpointConventionBuilder! diff --git a/src/Http/Routing/test/FunctionalTests/MapActionTest.cs b/src/Http/Routing/test/FunctionalTests/MapActionTest.cs index dd4ca4f81a..c39a657a10 100644 --- a/src/Http/Routing/test/FunctionalTests/MapActionTest.cs +++ b/src/Http/Routing/test/FunctionalTests/MapActionTest.cs @@ -11,7 +11,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Api; -using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -24,7 +23,7 @@ namespace Microsoft.AspNetCore.Routing.FunctionalTests [Fact] public async Task MapAction_FromBodyWorksWithJsonPayload() { - [HttpMethods(new[] { "POST" }, "/EchoTodo")] + [CustomRouteMetadata(Pattern = "/EchoTodo", Methods = new[] { "POST" })] Todo EchoTodo([FromBody] Todo todo) => todo; using var host = new HostBuilder() @@ -40,7 +39,6 @@ namespace Microsoft.AspNetCore.Routing.FunctionalTests }) .ConfigureServices(services => { - services.AddAuthorization(); services.AddRouting(); }) .Build(); @@ -71,23 +69,25 @@ namespace Microsoft.AspNetCore.Routing.FunctionalTests private class FromBodyAttribute : Attribute, IFromBodyMetadata { } - private class HttpMethodsAttribute : Attribute, IRouteTemplateProvider, IHttpMethodMetadata + private class CustomRouteMetadataAttribute : Attribute, IRoutePatternMetadata, IHttpMethodMetadata, IRouteNameMetadata, IRouteOrderMetadata { - public HttpMethodsAttribute(string[] httpMethods, string? template) - { - HttpMethods = httpMethods; - Template = template; - } + public string Pattern { get; set; } = "/"; + + public string? Name { get; set; } + + public int Order { get; set; } = 0; + + public string[] Methods { get; set; } = new[] { "GET" }; - public string? Template { get; } + string? IRoutePatternMetadata.RoutePattern => Pattern; - public IReadOnlyList<string> HttpMethods { get; } + string? IRouteNameMetadata.RouteName => Name; - public int? Order => null; + int? IRouteOrderMetadata.RouteOrder => Order; - public string? Name => null; + IReadOnlyList<string> IHttpMethodMetadata.HttpMethods => Methods; - public bool AcceptCorsPreflight => false; + bool IHttpMethodMetadata.AcceptCorsPreflight => false; } } } diff --git a/src/Http/Routing/test/UnitTests/Builder/MapActionEndpointRouteBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/MapActionEndpointRouteBuilderExtensionsTest.cs index 866d6a6491..5146baa5ac 100644 --- a/src/Http/Routing/test/UnitTests/Builder/MapActionEndpointRouteBuilderExtensionsTest.cs +++ b/src/Http/Routing/test/UnitTests/Builder/MapActionEndpointRouteBuilderExtensionsTest.cs @@ -6,8 +6,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; using Moq; using Xunit; @@ -29,17 +27,17 @@ namespace Microsoft.AspNetCore.Builder [Fact] public void MapAction_BuildsEndpointFromAttributes() { - const string customTemplate = "/CustomTemplate"; + const string customPattern = "/CustomTemplate"; const string customMethod = "CUSTOM_METHOD"; - [HttpMethods(Template = customTemplate, Methods = new[] { customMethod })] + [CustomRouteMetadata(Pattern = customPattern, Methods = new[] { customMethod })] void TestAction() { }; var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>()); _ = builder.MapAction((Action)TestAction); var routeEndpointBuilder = GetRouteEndpointBuilder(builder); - Assert.Equal(customTemplate, routeEndpointBuilder.RoutePattern.RawText); + Assert.Equal(customPattern, routeEndpointBuilder.RoutePattern.RawText); var dataSource = GetBuilderEndpointDataSource(builder); var endpoint = Assert.Single(dataSource.Endpoints); @@ -55,7 +53,7 @@ namespace Microsoft.AspNetCore.Builder const string customName = "Custom Name"; const int customOrder = 1337; - [HttpMethods(Name = customName, Order = customOrder)] + [CustomRouteMetadata(Name = customName, Order = customOrder)] void TestAction() { }; var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>()); @@ -70,21 +68,25 @@ namespace Microsoft.AspNetCore.Builder Assert.Equal(customOrder, routeEndpointBuilder.Order); } - private class HttpMethodsAttribute : Attribute, IHttpMethodMetadata, IRouteTemplateProvider + private class CustomRouteMetadataAttribute : Attribute, IRoutePatternMetadata, IHttpMethodMetadata, IRouteNameMetadata, IRouteOrderMetadata { - public string[] Methods { get; set; } = new[] { "GET" }; + public string Pattern { get; set; } = "/"; - public string Template { get; set; } = "/"; + public string? Name { get; set; } - public int Order { get; set; } + public int Order { get; set; } = 0; - public string? Name { get; set; } + public string[] Methods { get; set; } = new[] { "GET" }; + + string? IRoutePatternMetadata.RoutePattern => Pattern; + + string? IRouteNameMetadata.RouteName => Name; - public bool AcceptCorsPreflight => false; + int? IRouteOrderMetadata.RouteOrder => Order; IReadOnlyList<string> IHttpMethodMetadata.HttpMethods => Methods; - int? IRouteTemplateProvider.Order => Order; + bool IHttpMethodMetadata.AcceptCorsPreflight => false; } } } diff --git a/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt index e65b04716e..21a3bca71b 100644 --- a/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt +++ b/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt @@ -777,8 +777,8 @@ Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute.Order.get -> int Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute.Order.set -> void Microsoft.AspNetCore.Mvc.Routing.IActionHttpMethodProvider -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider (forwarded, contained in Microsoft.AspNetCore.Routing) -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Order.get -> int? (forwarded, contained in Microsoft.AspNetCore.Routing) +Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider +Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Order.get -> int? Microsoft.AspNetCore.Mvc.Routing.IRouteValueProvider Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory Microsoft.AspNetCore.Mvc.Routing.KnownRouteValueConstraint @@ -1843,8 +1843,8 @@ virtual Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Visit ~Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute.Name.set -> void ~Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute.Template.get -> string ~Microsoft.AspNetCore.Mvc.Routing.IActionHttpMethodProvider.HttpMethods.get -> System.Collections.Generic.IEnumerable<string> -~Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Name.get -> string (forwarded, contained in Microsoft.AspNetCore.Routing) -~Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Template.get -> string (forwarded, contained in Microsoft.AspNetCore.Routing) +~Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Name.get -> string +~Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Template.get -> string ~Microsoft.AspNetCore.Mvc.Routing.IRouteValueProvider.RouteKey.get -> string ~Microsoft.AspNetCore.Mvc.Routing.IRouteValueProvider.RouteValue.get -> string ~Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory.GetUrlHelper(Microsoft.AspNetCore.Mvc.ActionContext context) -> Microsoft.AspNetCore.Mvc.IUrlHelper diff --git a/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt index 5f3df412a0..835a7ede69 100644 --- a/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt +++ b/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt @@ -858,8 +858,8 @@ Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute.Name.get -> string? Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute.Name.set -> void Microsoft.AspNetCore.Mvc.Routing.HttpMethodAttribute.Template.get -> string? Microsoft.AspNetCore.Mvc.Routing.IActionHttpMethodProvider.HttpMethods.get -> System.Collections.Generic.IEnumerable<string!>! -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Name.get -> string? (forwarded, contained in Microsoft.AspNetCore.Routing) -Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Template.get -> string? (forwarded, contained in Microsoft.AspNetCore.Routing) +Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Name.get -> string? +Microsoft.AspNetCore.Mvc.Routing.IRouteTemplateProvider.Template.get -> string? Microsoft.AspNetCore.Mvc.Routing.IRouteValueProvider.RouteKey.get -> string! Microsoft.AspNetCore.Mvc.Routing.IRouteValueProvider.RouteValue.get -> string? Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory.GetUrlHelper(Microsoft.AspNetCore.Mvc.ActionContext! context) -> Microsoft.AspNetCore.Mvc.IUrlHelper! diff --git a/src/Http/Routing/src/IRouteTemplateProvider.cs b/src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs index 0934bad99f..f15e76abc6 100644 --- a/src/Http/Routing/src/IRouteTemplateProvider.cs +++ b/src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs @@ -3,12 +3,14 @@ #nullable enable +using Microsoft.AspNetCore.Routing; + namespace Microsoft.AspNetCore.Mvc.Routing { /// <summary> /// Interface for attributes which can supply a route template for attribute routing. /// </summary> - public interface IRouteTemplateProvider + public interface IRouteTemplateProvider : IRoutePatternMetadata, IRouteOrderMetadata, IRouteNameMetadata { /// <summary> /// The route template. May be <see langword="null"/>. @@ -28,5 +30,14 @@ namespace Microsoft.AspNetCore.Mvc.Routing /// of relying on selection of a route based on the given set of route values. /// </summary> string? Name { get; } + + /// <inheritdoc /> + string? IRoutePatternMetadata.RoutePattern => Template; + + /// <inheritdoc /> + int? IRouteOrderMetadata.RouteOrder => Order; + + /// <inheritdoc /> + string? IRouteNameMetadata.RouteName => Name; } } |