Changed singleton created dependencies in composition root to use IOptionsMonitor.

This commit is contained in:
Andy Butland
2020-09-03 12:29:23 +02:00
parent b87630250b
commit 14404f2720
7 changed files with 42 additions and 31 deletions

View File

@@ -15,9 +15,9 @@ namespace Umbraco.Core.Composing
private readonly TypeFinderSettings _settings;
private IEnumerable<string> _assembliesAcceptingLoadExceptions;
public TypeFinderConfig(IOptions<TypeFinderSettings> settings)
public TypeFinderConfig(IOptionsMonitor<TypeFinderSettings> settings)
{
_settings = settings.Value;
_settings = settings.CurrentValue;
}
public IEnumerable<string> AssembliesAcceptingLoadExceptions

View File

@@ -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<IOptionsMonitor<GlobalSettings>>(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<HostingSettings> GetIOptionsMonitorOfHostingSettings()
{
var hostingSettings = new HostingSettingsBuilder().Build();
return Mock.Of<IOptionsMonitor<HostingSettings>>(x => x.CurrentValue == hostingSettings);
}
public override IApplicationShutdownRegistry GetHostingEnvironmentLifetime() => _hostingLifetime;
public override IIpResolver GetIpResolver() => _ipResolver;

View File

@@ -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> hostingSettings, IWebHostEnvironment webHostEnvironment)
: base(hostingSettings, webHostEnvironment)
{
}

View File

@@ -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<IOptionsMonitor<HostingSettings>>(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")]

View File

@@ -6,9 +6,9 @@ namespace Umbraco.Web.Common.AspNetCore
{
public class AspNetCoreBackOfficeInfo : IBackOfficeInfo
{
public AspNetCoreBackOfficeInfo(IOptions<GlobalSettings> globalSettings)
public AspNetCoreBackOfficeInfo(IOptionsMonitor<GlobalSettings> globalSettings)
{
GetAbsoluteUrl = globalSettings.Value.UmbracoPath;
GetAbsoluteUrl = globalSettings.CurrentValue.UmbracoPath;
}
public string GetAbsoluteUrl { get; } // TODO make absolute

View File

@@ -15,9 +15,9 @@ namespace Umbraco.Web.Common.AspNetCore
private string _localTempPath;
public AspNetCoreHostingEnvironment(IOptions<HostingSettings> hostingSettings, IWebHostEnvironment webHostEnvironment)
public AspNetCoreHostingEnvironment(IOptionsMonitor<HostingSettings> 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;

View File

@@ -230,10 +230,10 @@ namespace Umbraco.Extensions
// `RegisterEssentials`.
var serviceProvider = services.BuildServiceProvider();
var globalSettings = serviceProvider.GetService<IOptions<GlobalSettings>>();
var globalSettings = serviceProvider.GetService<IOptionsMonitor<GlobalSettings>>();
var connectionStrings = serviceProvider.GetService<IOptions<ConnectionStrings>>();
var hostingSettings = serviceProvider.GetService<IOptions<HostingSettings>>();
var typeFinderSettings = serviceProvider.GetService<IOptions<TypeFinderSettings>>();
var hostingSettings = serviceProvider.GetService<IOptionsMonitor<HostingSettings>>();
var typeFinderSettings = serviceProvider.GetService<IOptionsMonitor<TypeFinderSettings>>();
var dbProviderFactoryCreator = serviceProvider.GetRequiredService<IDbProviderFactoryCreator>();
@@ -250,7 +250,7 @@ namespace Umbraco.Extensions
var configs = serviceProvider.GetService<Configs>();
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> typeFinderSettings)
private static ITypeFinder CreateTypeFinder(Core.Logging.ILogger logger, IProfiler profiler, IWebHostEnvironment webHostEnvironment, Assembly entryAssembly, IOptionsMonitor<TypeFinderSettings> 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> globalSettings,
IOptions<HostingSettings> hostingSettings,
IOptionsMonitor<GlobalSettings> globalSettings,
IOptionsMonitor<HostingSettings> hostingSettings,
IWebHostEnvironment webHostEnvironment,
ILoggingConfiguration loggingConfiguration,
out Core.Logging.ILogger logger,