From c2d1ab925e43ca78ce6971d450155c4452d2590e Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 16 Feb 2019 18:37:51 +1300 Subject: [PATCH] Remove obsolete APIs from routing (#7371) --- .../src/DefaultInlineConstraintResolver.cs | 16 ++-- .../src/IRouteValuesAddressMetadata.cs | 26 ------ .../Routing/src/RouteValuesAddressMetadata.cs | 88 ------------------- src/Http/Routing/src/Tree/TreeRouteBuilder.cs | 28 ------ .../DefaultInlineConstraintResolverTest.cs | 25 +----- .../RouteValuesAddressMetadataTests.cs | 37 -------- .../test/UnitTests/Tree/TreeRouterTest.cs | 81 ----------------- .../test/Routing/AttributeRoutingTest.cs | 4 +- 8 files changed, 10 insertions(+), 295 deletions(-) delete mode 100644 src/Http/Routing/src/IRouteValuesAddressMetadata.cs delete mode 100644 src/Http/Routing/src/RouteValuesAddressMetadata.cs delete mode 100644 src/Http/Routing/test/UnitTests/RouteValuesAddressMetadataTests.cs diff --git a/src/Http/Routing/src/DefaultInlineConstraintResolver.cs b/src/Http/Routing/src/DefaultInlineConstraintResolver.cs index 02fd133e28..7411fe485b 100644 --- a/src/Http/Routing/src/DefaultInlineConstraintResolver.cs +++ b/src/Http/Routing/src/DefaultInlineConstraintResolver.cs @@ -21,17 +21,15 @@ namespace Microsoft.AspNetCore.Routing /// /// Initializes a new instance of the class. /// - /// - /// Accessor for containing the constraints of interest. - /// - [Obsolete("This constructor is obsolete. Use DefaultInlineConstraintResolver.ctor(IOptions, IServiceProvider) instead.")] - public DefaultInlineConstraintResolver(IOptions routeOptions) - { - _inlineConstraintMap = routeOptions.Value.ConstraintMap; - } - + /// Accessor for containing the constraints of interest. + /// The to get service arguments from. public DefaultInlineConstraintResolver(IOptions routeOptions, IServiceProvider serviceProvider) { + if (routeOptions == null) + { + throw new ArgumentNullException(nameof(routeOptions)); + } + if (serviceProvider == null) { throw new ArgumentNullException(nameof(serviceProvider)); diff --git a/src/Http/Routing/src/IRouteValuesAddressMetadata.cs b/src/Http/Routing/src/IRouteValuesAddressMetadata.cs deleted file mode 100644 index 1bdae8727b..0000000000 --- a/src/Http/Routing/src/IRouteValuesAddressMetadata.cs +++ /dev/null @@ -1,26 +0,0 @@ -// 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. - -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNetCore.Routing -{ - /// - /// Represents metadata used during link generation to find - /// the associated endpoint using route values. - /// - [Obsolete("Route values are now specified on a RoutePattern.")] - public interface IRouteValuesAddressMetadata - { - /// - /// Gets the route name. Can be null. - /// - string RouteName { get; } - - /// - /// Gets the required route values. - /// - IReadOnlyDictionary RequiredValues { get; } - } -} diff --git a/src/Http/Routing/src/RouteValuesAddressMetadata.cs b/src/Http/Routing/src/RouteValuesAddressMetadata.cs deleted file mode 100644 index f09ed7aab2..0000000000 --- a/src/Http/Routing/src/RouteValuesAddressMetadata.cs +++ /dev/null @@ -1,88 +0,0 @@ -// 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. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.Linq; - -namespace Microsoft.AspNetCore.Routing -{ - /// - /// Metadata used during link generation to find the associated endpoint using route values. - /// - [DebuggerDisplay("{DebuggerToString(),nq}")] - [Obsolete("Route values are now specified on a RoutePattern.")] - public sealed class RouteValuesAddressMetadata : IRouteValuesAddressMetadata - { - private static readonly IReadOnlyDictionary EmptyRouteValues = - new ReadOnlyDictionary(new Dictionary()); - - /// - /// Creates a new instance of with the provided route name. - /// - /// The route name. Can be null. - public RouteValuesAddressMetadata(string routeName) : this(routeName, EmptyRouteValues) - { - } - - /// - /// Creates a new instance of with the provided required route values. - /// - /// The required route values. - public RouteValuesAddressMetadata(IReadOnlyDictionary requiredValues) : this(null, requiredValues) - { - } - - /// - /// Creates a new instance of with the provided route name and required route values. - /// - /// The route name. Can be null. - /// The required route values. - public RouteValuesAddressMetadata(string routeName, IReadOnlyDictionary requiredValues) - { - if (requiredValues == null) - { - throw new ArgumentNullException(nameof(requiredValues)); - } - - RouteName = routeName; - RequiredValues = requiredValues; - } - - /// - /// Gets the route name. Can be null. - /// - public string RouteName { get; } - - /// - /// Gets the required route values. - /// - public IReadOnlyDictionary RequiredValues { get; } - - internal string DebuggerToString() - { - return $"Name: {RouteName} - Required values: {string.Join(", ", FormatValues(RequiredValues))}"; - - IEnumerable FormatValues(IEnumerable> values) - { - if (values == null) - { - return Array.Empty(); - } - - return values.Select( - kvp => - { - var value = "null"; - if (kvp.Value != null) - { - value = "\"" + kvp.Value.ToString() + "\""; - } - return kvp.Key + " = " + value; - }); - } - } - } -} \ No newline at end of file diff --git a/src/Http/Routing/src/Tree/TreeRouteBuilder.cs b/src/Http/Routing/src/Tree/TreeRouteBuilder.cs index f796328a82..a8a11d803b 100644 --- a/src/Http/Routing/src/Tree/TreeRouteBuilder.cs +++ b/src/Http/Routing/src/Tree/TreeRouteBuilder.cs @@ -24,34 +24,6 @@ namespace Microsoft.AspNetCore.Routing.Tree private readonly ObjectPool _objectPool; private readonly IInlineConstraintResolver _constraintResolver; - /// - /// - /// This constructor is obsolete and will be removed in a future version. The recommended - /// alternative is the overload that does not take a UrlEncoder. - /// - /// Initializes a new instance of . - /// - /// The . - /// The . - /// The . - /// The . - [Obsolete("This constructor is obsolete and will be removed in a future version. The recommended " + - "alternative is the overload that does not take a UrlEncoder.")] - public TreeRouteBuilder( - ILoggerFactory loggerFactory, - UrlEncoder urlEncoder, - ObjectPool objectPool, - IInlineConstraintResolver constraintResolver) - : this(loggerFactory, objectPool, constraintResolver) - { - if (urlEncoder == null) - { - throw new ArgumentNullException(nameof(urlEncoder)); - } - - _urlEncoder = urlEncoder; - } - /// /// Initializes a new instance of . /// diff --git a/src/Http/Routing/test/UnitTests/DefaultInlineConstraintResolverTest.cs b/src/Http/Routing/test/UnitTests/DefaultInlineConstraintResolverTest.cs index 63aef81de4..da4cf39c09 100644 --- a/src/Http/Routing/test/UnitTests/DefaultInlineConstraintResolverTest.cs +++ b/src/Http/Routing/test/UnitTests/DefaultInlineConstraintResolverTest.cs @@ -325,33 +325,12 @@ namespace Microsoft.AspNetCore.Routing.Tests ex.Message); } - [Fact] - public void ResolveConstraint_HasArguments_NoServiceProvider() - { - // Arrange - var routeOptions = new RouteOptions(); - var constraintResolver = GetInlineConstraintResolver(routeOptions, hasServiceProvider: false); - - // Act - var constraint = constraintResolver.ResolveConstraint("regex(ab,1)"); - - // Assert - Assert.IsType(constraint); - } - - private IInlineConstraintResolver GetInlineConstraintResolver(RouteOptions routeOptions, bool hasServiceProvider = true) + private IInlineConstraintResolver GetInlineConstraintResolver(RouteOptions routeOptions) { var optionsAccessor = new Mock>(); optionsAccessor.SetupGet(o => o.Value).Returns(routeOptions); - if (hasServiceProvider) - { - return new DefaultInlineConstraintResolver(optionsAccessor.Object, new TestServiceProvider()); - } - -#pragma warning disable CS0618 // Type or member is obsolete - return new DefaultInlineConstraintResolver(optionsAccessor.Object); -#pragma warning restore CS0618 // Type or member is obsolete + return new DefaultInlineConstraintResolver(optionsAccessor.Object, new TestServiceProvider()); } private class MultiConstructorRouteConstraint : IRouteConstraint diff --git a/src/Http/Routing/test/UnitTests/RouteValuesAddressMetadataTests.cs b/src/Http/Routing/test/UnitTests/RouteValuesAddressMetadataTests.cs deleted file mode 100644 index 5c60f5e3ed..0000000000 --- a/src/Http/Routing/test/UnitTests/RouteValuesAddressMetadataTests.cs +++ /dev/null @@ -1,37 +0,0 @@ -// 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. - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; - -namespace Microsoft.AspNetCore.Routing -{ - public class RouteValuesAddressMetadataTests - { - [Fact] - public void DebuggerToString_NoNameAndRequiredValues_ReturnsString() - { -#pragma warning disable CS0618 // Type or member is obsolete - var metadata = new RouteValuesAddressMetadata(null, new Dictionary()); -#pragma warning restore CS0618 // Type or member is obsolete - - Assert.Equal("Name: - Required values: ", metadata.DebuggerToString()); - } - - [Fact] - public void DebuggerToString_HasNameAndRequiredValues_ReturnsString() - { -#pragma warning disable CS0618 // Type or member is obsolete - var metadata = new RouteValuesAddressMetadata("Name!", new Dictionary - { - ["requiredValue1"] = "One", - ["requiredValue2"] = 2, - }); -#pragma warning restore CS0618 // Type or member is obsolete - - Assert.Equal("Name: Name! - Required values: requiredValue1 = \"One\", requiredValue2 = \"2\"", metadata.DebuggerToString()); - } - } -} diff --git a/src/Http/Routing/test/UnitTests/Tree/TreeRouterTest.cs b/src/Http/Routing/test/UnitTests/Tree/TreeRouterTest.cs index f18cb657bc..b655941c00 100644 --- a/src/Http/Routing/test/UnitTests/Tree/TreeRouterTest.cs +++ b/src/Http/Routing/test/UnitTests/Tree/TreeRouterTest.cs @@ -26,70 +26,6 @@ namespace Microsoft.AspNetCore.Routing.Tree private static ObjectPool Pool = new DefaultObjectPoolProvider().Create( new UriBuilderContextPooledObjectPolicy()); - [Fact] - public async Task TreeRouter_RouteAsync_MatchesCatchAllRoutesWithDefaults_UsingObsoleteConstructo() - { - // Arrange - var routes = new[] { - "{parameter1=1}/{parameter2=2}/{parameter3=3}/{*parameter4=4}", - }; - var url = "/a/b/c"; - var routeValues = new[] { "a", "b", "c", "4" }; - - var expectedRouteGroup = CreateRouteGroup(0, "{parameter1=1}/{parameter2=2}/{parameter3=3}/{*parameter4=4}"); - var routeValueKeys = new[] { "parameter1", "parameter2", "parameter3", "parameter4" }; - var expectedRouteValues = new RouteValueDictionary(); - for (var i = 0; i < routeValueKeys.Length; i++) - { - expectedRouteValues.Add(routeValueKeys[i], routeValues[i]); - } - - var builder = CreateBuilderUsingObsoleteConstructor(); - - // We setup the route entries in reverse order of precedence to ensure that when we - // try to route the request, the route with a higher precedence gets tried first. - foreach (var template in routes.Reverse()) - { - MapInboundEntry(builder, template); - } - - var route = builder.Build(); - - var context = CreateRouteContext(url); - - // Act - await route.RouteAsync(context); - - // Assert - Assert.Equal(expectedRouteGroup, context.RouteData.Values["test_route_group"]); - foreach (var entry in expectedRouteValues) - { - var data = Assert.Single(context.RouteData.Values, v => v.Key == entry.Key); - Assert.Equal(entry.Value, data.Value); - } - } - - [Fact] - public async Task TreeRouter_RouteAsync_DoesNotMatchRoutesWithIntermediateDefaultRouteValues_UsingObsoleteConstructor() - { - // Arrange - var url = "/a/b"; - - var builder = CreateBuilderUsingObsoleteConstructor(); - - MapInboundEntry(builder, "a/b/{parameter3=3}/d"); - - var route = builder.Build(); - - var context = CreateRouteContext(url); - - // Act - await route.RouteAsync(context); - - // Assert - Assert.Null(context.Handler); - } - [Theory] [InlineData("template/5", "template/{parameter:int}")] [InlineData("template/5", "template/{parameter}")] @@ -2151,23 +2087,6 @@ namespace Microsoft.AspNetCore.Routing.Tree return builder; } - private static TreeRouteBuilder CreateBuilderUsingObsoleteConstructor() - { - var objectPoolProvider = new DefaultObjectPoolProvider(); - var objectPolicy = new UriBuilderContextPooledObjectPolicy(); - var objectPool = objectPoolProvider.Create(objectPolicy); - - var constraintResolver = CreateConstraintResolver(); -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new TreeRouteBuilder( - NullLoggerFactory.Instance, - UrlEncoder.Default, - objectPool, - constraintResolver); -#pragma warning restore CS0618 // Type or member is obsolete - return builder; - } - private static TreeRouter CreateTreeRouter( string firstTemplate, string secondTemplate) diff --git a/src/Mvc/Mvc.Core/test/Routing/AttributeRoutingTest.cs b/src/Mvc/Mvc.Core/test/Routing/AttributeRoutingTest.cs index 4a1ca076d5..eb170882ed 100644 --- a/src/Mvc/Mvc.Core/test/Routing/AttributeRoutingTest.cs +++ b/src/Mvc/Mvc.Core/test/Routing/AttributeRoutingTest.cs @@ -174,9 +174,7 @@ namespace Microsoft.AspNetCore.Mvc.Routing .SetupGet(o => o.Value) .Returns(new RouteOptions()); -#pragma warning disable CS0618 // Type or member is obsolete - var inlineConstraintResolver = new DefaultInlineConstraintResolver(routeOptions.Object); -#pragma warning restore CS0618 // Type or member is obsolete + var inlineConstraintResolver = new DefaultInlineConstraintResolver(routeOptions.Object, Mock.Of()); var services = new ServiceCollection() .AddSingleton(inlineConstraintResolver);