Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/aspnetcore.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Halter <halter73@gmail.com>2021-02-09 22:32:13 +0300
committerStephen Halter <halter73@gmail.com>2021-02-09 22:32:13 +0300
commit64ed5037a214599c61656f7dc970e84ac0d08d8c (patch)
tree6017cf57e82f8935b31be99dc390b91128fc28ab
parentb0afb378baf9e963564d90351b6393442f144594 (diff)
Move IRouteTemplateProvider backhalter73/29684-rebase
-rw-r--r--src/Http/Routing/src/Builder/MapActionEndpointRouteBuilderExtensions.cs15
-rw-r--r--src/Http/Routing/src/IRouteOrderMetadata.cs19
-rw-r--r--src/Http/Routing/src/IRoutePatternMetadata.cs16
-rw-r--r--src/Http/Routing/src/PublicAPI.Unshipped.txt8
-rw-r--r--src/Http/Routing/test/FunctionalTests/MapActionTest.cs28
-rw-r--r--src/Http/Routing/test/UnitTests/Builder/MapActionEndpointRouteBuilderExtensionsTest.cs28
-rw-r--r--src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt8
-rw-r--r--src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt4
-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;
}
}