diff --git a/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/ApplicationModelConventionExtensions.cs b/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/ApplicationModelConventionExtensions.cs index 2696e235ff..f8d97a4ccd 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/ApplicationModelConventionExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/ApplicationModelConventionExtensions.cs @@ -47,18 +47,82 @@ namespace Microsoft.Extensions.DependencyInjection this IList conventions, IActionModelConvention actionModelConvention) { + if (conventions == null) + { + throw new ArgumentNullException(nameof(conventions)); + } + + if (actionModelConvention == null) + { + throw new ArgumentNullException(nameof(actionModelConvention)); + } + conventions.Add(new ActionApplicationModelConvention(actionModelConvention)); } + /// + /// Adds a to all the parameters in the application. + /// + /// The list of + /// in . + /// The which needs to be + /// added. + public static void Add( + this IList conventions, + IParameterModelConvention parameterModelConvention) + { + if (conventions == null) + { + throw new ArgumentNullException(nameof(conventions)); + } + + if (parameterModelConvention == null) + { + throw new ArgumentNullException(nameof(parameterModelConvention)); + } + + conventions.Add(new ParameterApplicationModelConvention(parameterModelConvention)); + } + + private class ParameterApplicationModelConvention : IApplicationModelConvention + { + private IParameterModelConvention _parameterModelConvention; + + public ParameterApplicationModelConvention(IParameterModelConvention parameterModelConvention) + { + if (parameterModelConvention == null) + { + throw new ArgumentNullException(nameof(parameterModelConvention)); + } + + _parameterModelConvention = parameterModelConvention; + } + + /// + public void Apply(ApplicationModel application) + { + if (application == null) + { + throw new ArgumentNullException(nameof(application)); + } + + foreach (var controller in application.Controllers) + { + foreach (var action in controller.Actions) + { + foreach (var parameter in action.Parameters) + { + _parameterModelConvention.Apply(parameter); + } + } + } + } + } + private class ActionApplicationModelConvention : IApplicationModelConvention { private IActionModelConvention _actionModelConvention; - /// - /// Initializes a new instance of . - /// - /// The action convention to be applied on all actions - /// in the application. public ActionApplicationModelConvention(IActionModelConvention actionModelConvention) { if (actionModelConvention == null) @@ -91,11 +155,6 @@ namespace Microsoft.Extensions.DependencyInjection { private IControllerModelConvention _controllerModelConvention; - /// - /// Initializes a new instance of . - /// - /// The controller convention to be applied on all controllers - /// in the application. public ControllerApplicationModelConvention(IControllerModelConvention controllerConvention) { if (controllerConvention == null) diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/ApplicationModelConventionExtensionsTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/ApplicationModelConventionExtensionsTest.cs index 3a51e8ff4c..b9b42e2e27 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/ApplicationModelConventionExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/ApplicationModelConventionExtensionsTest.cs @@ -12,6 +12,35 @@ namespace Microsoft.Extensions.DependencyInjection { public class ApplicationModelConventionExtensionsTest { + [Fact] + public void DefaultParameterModelConvention_AppliesToAllParametersInApp() + { + // Arrange + var app = new ApplicationModel(); + app.Controllers.Add(new ControllerModel(typeof(HelloController).GetTypeInfo(), new List())); + app.Controllers.Add(new ControllerModel(typeof(WorldController).GetTypeInfo(), new List())); + + var options = new MvcOptions(); + options.Conventions.Add(new SimpleParameterConvention()); + + // Act + options.Conventions[0].Apply(app); + + // Assert + foreach (var controller in app.Controllers) + { + foreach (var action in controller.Actions) + { + foreach (var parameter in action.Parameters) + { + var kvp = Assert.Single(parameter.Properties); + Assert.Equal("TestProperty", kvp.Key); + Assert.Equal("TestValue", kvp.Value); + } + } + } + } + [Fact] public void DefaultActionModelConvention_AppliesToAllActionsInApp() { @@ -31,7 +60,9 @@ namespace Microsoft.Extensions.DependencyInjection { foreach (var action in controller.Actions) { - Assert.True(action.Properties.ContainsKey("TestProperty")); + var kvp = Assert.Single(action.Properties); + Assert.Equal("TestProperty", kvp.Key); + Assert.Equal("TestValue", kvp.Value); } } } @@ -52,7 +83,9 @@ namespace Microsoft.Extensions.DependencyInjection // Assert foreach (var controller in app.Controllers) { - Assert.True(controller.Properties.ContainsKey("TestProperty")); + var kvp = Assert.Single(controller.Properties); + Assert.Equal("TestProperty", kvp.Key); + Assert.Equal("TestValue", kvp.Value); } } @@ -72,6 +105,14 @@ namespace Microsoft.Extensions.DependencyInjection } } + private class SimpleParameterConvention : IParameterModelConvention + { + public void Apply(ParameterModel parameter) + { + parameter.Properties.Add("TestProperty", "TestValue"); + } + } + private class SimpleActionConvention : IActionModelConvention { public void Apply(ActionModel action)