From 8d936c08dacb91e719dae5cd404876ab2b26f156 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 7 Jul 2021 12:52:02 +0100 Subject: [PATCH] Change RenderController defautl type to be swapped out using the .NETCore options pattern --- .../Routing/UmbracoRouteValuesFactoryTests.cs | 9 +++--- .../Controllers/UmbracoRenderingDefaults.cs | 14 ---------- ....cs => UmbracoRenderingDefaultsOptions.cs} | 4 +-- .../UmbracoRenderingDefaultsOptionsSetup.cs | 28 +++++++++++++++++++ .../UmbracoBuilderExtensions.cs | 5 +++- .../Routing/UmbracoRouteValuesFactory.cs | 7 ++--- 6 files changed, 42 insertions(+), 25 deletions(-) delete mode 100644 src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaults.cs rename src/Umbraco.Web.Website/Controllers/{IUmbracoRenderingDefaults.cs => UmbracoRenderingDefaultsOptions.cs} (72%) create mode 100644 src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaultsOptionsSetup.cs diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs index 2bd482b8eb..1e7d19e18f 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; using Moq; using NUnit.Framework; using Umbraco.Cms.Core.Features; @@ -29,7 +30,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Website.Routing { private UmbracoRouteValuesFactory GetFactory( out Mock publishedRouter, - out UmbracoRenderingDefaults renderingDefaults, + out IOptions renderingDefaults, out IPublishedRequest request) { var builder = new PublishedRequestBuilder(new Uri("https://example.com"), Mock.Of()); @@ -41,7 +42,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Website.Routing .Returns((IPublishedRequest r, IPublishedContent c) => Task.FromResult(builtRequest)) .Verifiable(); - renderingDefaults = new UmbracoRenderingDefaults(); + renderingDefaults = Mock.Of>(x => x.Value.DefaultControllerType == typeof(RenderController)); // add the default one var actionDescriptors = new List @@ -82,12 +83,12 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Website.Routing [Test] public async Task Adds_Result_To_Route_Value_Dictionary() { - UmbracoRouteValuesFactory factory = GetFactory(out _, out UmbracoRenderingDefaults renderingDefaults, out IPublishedRequest request); + UmbracoRouteValuesFactory factory = GetFactory(out _, out IOptions renderingDefaults, out IPublishedRequest request); UmbracoRouteValues result = await factory.CreateAsync(new DefaultHttpContext(), request); Assert.IsNotNull(result); - Assert.AreEqual(renderingDefaults.DefaultControllerType, result.ControllerType); + Assert.AreEqual(renderingDefaults.Value.DefaultControllerType, result.ControllerType); Assert.AreEqual(UmbracoRouteValues.DefaultActionName, result.ActionName); Assert.IsNull(result.TemplateName); } diff --git a/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaults.cs b/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaults.cs deleted file mode 100644 index 095f57b631..0000000000 --- a/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaults.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Umbraco.Cms.Web.Common.Controllers; - -namespace Umbraco.Cms.Web.Website.Controllers -{ - /// - /// The defaults used for rendering Umbraco front-end pages - /// - public class UmbracoRenderingDefaults : IUmbracoRenderingDefaults - { - /// - public Type DefaultControllerType => typeof(RenderController); - } -} diff --git a/src/Umbraco.Web.Website/Controllers/IUmbracoRenderingDefaults.cs b/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaultsOptions.cs similarity index 72% rename from src/Umbraco.Web.Website/Controllers/IUmbracoRenderingDefaults.cs rename to src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaultsOptions.cs index 6f4fdb0cb2..120d0f6099 100644 --- a/src/Umbraco.Web.Website/Controllers/IUmbracoRenderingDefaults.cs +++ b/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaultsOptions.cs @@ -5,11 +5,11 @@ namespace Umbraco.Cms.Web.Website.Controllers /// /// The defaults used for rendering Umbraco front-end pages /// - public interface IUmbracoRenderingDefaults + public class UmbracoRenderingDefaultsOptions { /// /// Gets the default umbraco render controller type /// - Type DefaultControllerType { get; } + public Type DefaultControllerType { get; set; } } } diff --git a/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaultsOptionsSetup.cs b/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaultsOptionsSetup.cs new file mode 100644 index 0000000000..22b970dc92 --- /dev/null +++ b/src/Umbraco.Web.Website/Controllers/UmbracoRenderingDefaultsOptionsSetup.cs @@ -0,0 +1,28 @@ +using System; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Web.Common.Controllers; + +namespace Umbraco.Cms.Web.Website.Controllers +{ + public class UmbracoRenderingDefaultsOptionsSetup : IConfigureOptions + { + //private IOptions _umbracoRenderingDefaultOptions; + + //public UmbracoRenderingDefaultsOptionsSetup(IOptions umbracoRenderingDefaultOptions) + //{ + // _umbracoRenderingDefaultOptions = umbracoRenderingDefaultOptions; + //} + + public void Configure(UmbracoRenderingDefaultsOptions options) + { + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + + //options.DefaultControllerType = _umbracoRenderingDefaultOptions.Value.DefaultControllerType; + + options.DefaultControllerType = typeof(RenderController); + } + } +} diff --git a/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs index 69618004c7..3f050e5ad1 100644 --- a/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs @@ -40,7 +40,10 @@ namespace Umbraco.Extensions builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); - builder.Services.AddSingleton(); + + // Umbraco Rendering Defaults startup options to define which RenderController type to use + builder.Services.ConfigureOptions(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); diff --git a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs index e1b85919f4..5cba399fba 100644 --- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs +++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs @@ -2,6 +2,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Controllers; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Features; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.Routing; @@ -18,7 +19,6 @@ namespace Umbraco.Cms.Web.Website.Routing /// public class UmbracoRouteValuesFactory : IUmbracoRouteValuesFactory { - private readonly IUmbracoRenderingDefaults _renderingDefaults; private readonly IShortStringHelper _shortStringHelper; private readonly UmbracoFeatures _umbracoFeatures; private readonly IControllerActionSearcher _controllerActionSearcher; @@ -30,18 +30,17 @@ namespace Umbraco.Cms.Web.Website.Routing /// Initializes a new instance of the class. /// public UmbracoRouteValuesFactory( - IUmbracoRenderingDefaults renderingDefaults, + IOptions renderingDefaults, IShortStringHelper shortStringHelper, UmbracoFeatures umbracoFeatures, IControllerActionSearcher controllerActionSearcher, IPublishedRouter publishedRouter) { - _renderingDefaults = renderingDefaults; _shortStringHelper = shortStringHelper; _umbracoFeatures = umbracoFeatures; _controllerActionSearcher = controllerActionSearcher; _publishedRouter = publishedRouter; - _defaultControllerName = new Lazy(() => ControllerExtensions.GetControllerName(_renderingDefaults.DefaultControllerType)); + _defaultControllerName = new Lazy(() => ControllerExtensions.GetControllerName(renderingDefaults.Value.DefaultControllerType)); _defaultControllerDescriptor = new Lazy(() => { ControllerActionDescriptor descriptor = _controllerActionSearcher.Find(