From f7a26f5b58aaffafd681fed67a1f5dbea2ffeae3 Mon Sep 17 00:00:00 2001 From: Mole Date: Fri, 14 Oct 2022 20:04:19 +0200 Subject: [PATCH] Only replace the MS services when the site is actually set to InMemoryAuto (#13201) --- src/Umbraco.Core/Constants-Configuration.cs | 1 + .../Extensions/ConfigurationExtensions.cs | 4 ++ ...acoBuilderDependencyInjectionExtensions.cs | 40 ++++++++----------- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/Umbraco.Core/Constants-Configuration.cs b/src/Umbraco.Core/Constants-Configuration.cs index 11694fa5c0..bc4c29cfa6 100644 --- a/src/Umbraco.Core/Constants-Configuration.cs +++ b/src/Umbraco.Core/Constants-Configuration.cs @@ -41,6 +41,7 @@ public static partial class Constants public const string ConfigLogging = ConfigPrefix + "Logging"; public const string ConfigMemberPassword = ConfigPrefix + "Security:MemberPassword"; public const string ConfigModelsBuilder = ConfigPrefix + "ModelsBuilder"; + public const string ConfigModelsMode = ConfigModelsBuilder + ":ModelsMode"; public const string ConfigNuCache = ConfigPrefix + "NuCache"; public const string ConfigPlugins = ConfigPrefix + "Plugins"; public const string ConfigRequestHandler = ConfigPrefix + "RequestHandler"; diff --git a/src/Umbraco.Core/Extensions/ConfigurationExtensions.cs b/src/Umbraco.Core/Extensions/ConfigurationExtensions.cs index 2003079736..2bdc75c7b1 100644 --- a/src/Umbraco.Core/Extensions/ConfigurationExtensions.cs +++ b/src/Umbraco.Core/Extensions/ConfigurationExtensions.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Configuration; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; namespace Umbraco.Extensions; @@ -101,4 +102,7 @@ public static class ConfigurationExtensions /// public static RuntimeMode GetRuntimeMode(this IConfiguration configuration) => configuration.GetValue(Constants.Configuration.ConfigRuntimeMode); + + public static ModelsMode GetModelsMode(this IConfiguration configuration) => + configuration.GetValue(Constants.Configuration.ConfigModelsMode); } diff --git a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs index 7e79d8787d..48a4478dc4 100644 --- a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs +++ b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs @@ -140,35 +140,27 @@ public static class UmbracoBuilderDependencyInjectionExtensions return builder; } + // See notes in RefreshingRazorViewEngine for information on what this is doing. private static IUmbracoBuilder AddInMemoryModelsRazorEngine(this IUmbracoBuilder builder) { - // See notes in RefreshingRazorViewEngine for information on what this is doing. + // We should only add/replace these services when models builder is InMemory, otherwise we'll cause issues. + // Since these services expect the ModelsMode to be InMemoryAuto + if (builder.Config.GetModelsMode() is ModelsMode.InMemoryAuto) + { + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); - // copy the current collection, we need to use this later to rebuild a container - // to re-create the razor compiler provider - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - - builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + // Register the factory as IPublishedModelFactory + builder.Services.AddSingleton(); + return builder; + } // This is what the community MB would replace, all of the above services are fine to be registered - // even if the community MB is in place. - builder.Services.AddSingleton(factory => - { - ModelsBuilderSettings modelsBuilderSettings = factory.GetRequiredService>().Value; - if (modelsBuilderSettings.ModelsMode == ModelsMode.InMemoryAuto) - { - return factory.GetRequiredService(); - } - else - { - return factory.CreateDefaultPublishedModelFactory(); - } - }); - + builder.Services.AddSingleton(factory => factory.CreateDefaultPublishedModelFactory()); return builder; } }