From 14404f27203f58592d2a49537af912f154f34b58 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Thu, 3 Sep 2020 12:29:23 +0200 Subject: [PATCH] Changed singleton created dependencies in composition root to use IOptionsMonitor. --- .../Composing/TypeFinderConfig.cs | 4 +-- .../Implementations/TestHelper.cs | 29 ++++++++++++------- .../Implementations/TestHostingEnvironment.cs | 4 +-- .../Extensions/UriExtensionsTests.cs | 14 +++++---- .../AspNetCore/AspNetCoreBackOfficeInfo.cs | 4 +-- .../AspNetCoreHostingEnvironment.cs | 4 +-- .../UmbracoCoreServiceCollectionExtensions.cs | 14 ++++----- 7 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Core/Composing/TypeFinderConfig.cs b/src/Umbraco.Core/Composing/TypeFinderConfig.cs index ef862fd49d..302d45b4e8 100644 --- a/src/Umbraco.Core/Composing/TypeFinderConfig.cs +++ b/src/Umbraco.Core/Composing/TypeFinderConfig.cs @@ -15,9 +15,9 @@ namespace Umbraco.Core.Composing private readonly TypeFinderSettings _settings; private IEnumerable _assembliesAcceptingLoadExceptions; - public TypeFinderConfig(IOptions settings) + public TypeFinderConfig(IOptionsMonitor settings) { - _settings = settings.Value; + _settings = settings.CurrentValue; } public IEnumerable AssembliesAcceptingLoadExceptions diff --git a/src/Umbraco.Tests.Integration/Implementations/TestHelper.cs b/src/Umbraco.Tests.Integration/Implementations/TestHelper.cs index c2beb3cdb3..fc7974f8f3 100644 --- a/src/Umbraco.Tests.Integration/Implementations/TestHelper.cs +++ b/src/Umbraco.Tests.Integration/Implementations/TestHelper.cs @@ -1,26 +1,26 @@ - -using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Hosting; -using Moq; +using System; using System.Data.Common; using System.IO; using System.Net; using System.Reflection; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; +using Moq; using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.Configuration.Models; using Umbraco.Core.Diagnostics; using Umbraco.Core.Hosting; using Umbraco.Core.Logging; -using Umbraco.Net; using Umbraco.Core.Persistence; using Umbraco.Core.Runtime; +using Umbraco.Net; using Umbraco.Tests.Common; +using Umbraco.Tests.Common.Builders; using Umbraco.Web.Common.AspNetCore; using IHostingEnvironment = Umbraco.Core.Hosting.IHostingEnvironment; -using Umbraco.Tests.Common.Builders; -using Microsoft.Extensions.Options; namespace Umbraco.Tests.Integration.Implementations { @@ -106,7 +106,8 @@ namespace Umbraco.Tests.Integration.Implementations if (_backOfficeInfo == null) { var globalSettings = new GlobalSettingsBuilder().Build(); - _backOfficeInfo = new AspNetCoreBackOfficeInfo(Options.Create(globalSettings)); + var mockedOptionsMonitorOfGlobalSettings = Mock.Of>(x => x.CurrentValue == globalSettings); + _backOfficeInfo = new AspNetCoreBackOfficeInfo(mockedOptionsMonitorOfGlobalSettings); } return _backOfficeInfo; @@ -114,9 +115,15 @@ namespace Umbraco.Tests.Integration.Implementations public override IHostingEnvironment GetHostingEnvironment() => _hostingEnvironment ??= new TestHostingEnvironment( - new HostingSettingsBuilder().Build(), + GetIOptionsMonitorOfHostingSettings(), _hostEnvironment); + private IOptionsMonitor GetIOptionsMonitorOfHostingSettings() + { + var hostingSettings = new HostingSettingsBuilder().Build(); + return Mock.Of>(x => x.CurrentValue == hostingSettings); + } + public override IApplicationShutdownRegistry GetHostingEnvironmentLifetime() => _hostingLifetime; public override IIpResolver GetIpResolver() => _ipResolver; diff --git a/src/Umbraco.Tests.Integration/Implementations/TestHostingEnvironment.cs b/src/Umbraco.Tests.Integration/Implementations/TestHostingEnvironment.cs index c03a1a1699..1a3415634b 100644 --- a/src/Umbraco.Tests.Integration/Implementations/TestHostingEnvironment.cs +++ b/src/Umbraco.Tests.Integration/Implementations/TestHostingEnvironment.cs @@ -8,8 +8,8 @@ namespace Umbraco.Tests.Integration.Implementations { public class TestHostingEnvironment : AspNetCoreHostingEnvironment, IHostingEnvironment { - public TestHostingEnvironment(HostingSettings hostingSettings, IWebHostEnvironment webHostEnvironment) - : base(Options.Create(hostingSettings), webHostEnvironment) + public TestHostingEnvironment(IOptionsMonitor hostingSettings, IWebHostEnvironment webHostEnvironment) + : base(hostingSettings, webHostEnvironment) { } diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/UriExtensionsTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/UriExtensionsTests.cs index 5e394eeffb..f098af7de6 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/UriExtensionsTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/UriExtensionsTests.cs @@ -48,10 +48,8 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Extensions [TestCase("http://www.domain.com/umbraco/test/legacyAjaxCalls.ashx?some=query&blah=js", "", true)] public void Is_Back_Office_Request(string input, string virtualPath, bool expected) { - var hostingSettings = new HostingSettingsBuilder().WithApplicationVirtualPath(virtualPath).Build(); - var hostingEnvironment = new AspNetCoreHostingEnvironment(Options.Create(hostingSettings), _hostEnvironment); - var source = new Uri(input); + var hostingEnvironment = CreateHostingEnvironment(virtualPath); Assert.AreEqual(expected, source.IsBackOfficeRequest(_globalSettings, hostingEnvironment)); } @@ -67,11 +65,17 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Extensions public void Is_Installer_Request(string input, bool expected) { var source = new Uri(input); - var hostingSettings = new HostingSettingsBuilder().Build(); - var hostingEnvironment = new AspNetCoreHostingEnvironment(Options.Create(hostingSettings), _hostEnvironment); + var hostingEnvironment = CreateHostingEnvironment(); Assert.AreEqual(expected, source.IsInstallerRequest(hostingEnvironment)); } + private AspNetCoreHostingEnvironment CreateHostingEnvironment(string virtualPath = "") + { + var hostingSettings = new HostingSettingsBuilder().WithApplicationVirtualPath(virtualPath).Build(); + var mockedOptionsMonitorOfHostingSettings = Mock.Of>(x => x.CurrentValue == hostingSettings); + return new AspNetCoreHostingEnvironment(mockedOptionsMonitorOfHostingSettings, _hostEnvironment); + } + [TestCase("http://www.domain.com/foo/bar", "/", "http://www.domain.com/")] [TestCase("http://www.domain.com/foo/bar#hop", "/", "http://www.domain.com/")] [TestCase("http://www.domain.com/foo/bar?q=2#hop", "/", "http://www.domain.com/?q=2")] diff --git a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreBackOfficeInfo.cs b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreBackOfficeInfo.cs index edc5efdd1e..fe991275de 100644 --- a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreBackOfficeInfo.cs +++ b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreBackOfficeInfo.cs @@ -6,9 +6,9 @@ namespace Umbraco.Web.Common.AspNetCore { public class AspNetCoreBackOfficeInfo : IBackOfficeInfo { - public AspNetCoreBackOfficeInfo(IOptions globalSettings) + public AspNetCoreBackOfficeInfo(IOptionsMonitor globalSettings) { - GetAbsoluteUrl = globalSettings.Value.UmbracoPath; + GetAbsoluteUrl = globalSettings.CurrentValue.UmbracoPath; } public string GetAbsoluteUrl { get; } // TODO make absolute diff --git a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs index 84518c16de..296f083659 100644 --- a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs +++ b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs @@ -15,9 +15,9 @@ namespace Umbraco.Web.Common.AspNetCore private string _localTempPath; - public AspNetCoreHostingEnvironment(IOptions hostingSettings, IWebHostEnvironment webHostEnvironment) + public AspNetCoreHostingEnvironment(IOptionsMonitor hostingSettings, IWebHostEnvironment webHostEnvironment) { - _hostingSettings = hostingSettings.Value ?? throw new ArgumentNullException(nameof(hostingSettings)); + _hostingSettings = hostingSettings.CurrentValue ?? throw new ArgumentNullException(nameof(hostingSettings)); _webHostEnvironment = webHostEnvironment ?? throw new ArgumentNullException(nameof(webHostEnvironment)); SiteName = webHostEnvironment.ApplicationName; diff --git a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs index fb16d0db8e..8d91aad5f3 100644 --- a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs @@ -230,10 +230,10 @@ namespace Umbraco.Extensions // `RegisterEssentials`. var serviceProvider = services.BuildServiceProvider(); - var globalSettings = serviceProvider.GetService>(); + var globalSettings = serviceProvider.GetService>(); var connectionStrings = serviceProvider.GetService>(); - var hostingSettings = serviceProvider.GetService>(); - var typeFinderSettings = serviceProvider.GetService>(); + var hostingSettings = serviceProvider.GetService>(); + var typeFinderSettings = serviceProvider.GetService>(); var dbProviderFactoryCreator = serviceProvider.GetRequiredService(); @@ -250,7 +250,7 @@ namespace Umbraco.Extensions var configs = serviceProvider.GetService(); var coreRuntime = GetCoreRuntime( configs, - globalSettings.Value, + globalSettings.CurrentValue, connectionStrings.Value, umbracoVersion, ioHelper, @@ -267,7 +267,7 @@ namespace Umbraco.Extensions return services; } - private static ITypeFinder CreateTypeFinder(Core.Logging.ILogger logger, IProfiler profiler, IWebHostEnvironment webHostEnvironment, Assembly entryAssembly, IOptions typeFinderSettings) + private static ITypeFinder CreateTypeFinder(Core.Logging.ILogger logger, IProfiler profiler, IWebHostEnvironment webHostEnvironment, Assembly entryAssembly, IOptionsMonitor typeFinderSettings) { var runtimeHashPaths = new RuntimeHashPaths(); runtimeHashPaths.AddFolder(new DirectoryInfo(Path.Combine(webHostEnvironment.ContentRootPath, "bin"))); @@ -311,8 +311,8 @@ namespace Umbraco.Extensions private static IServiceCollection CreateCompositionRoot( IServiceCollection services, - IOptions globalSettings, - IOptions hostingSettings, + IOptionsMonitor globalSettings, + IOptionsMonitor hostingSettings, IWebHostEnvironment webHostEnvironment, ILoggingConfiguration loggingConfiguration, out Core.Logging.ILogger logger,