From 39657dea6d37e468006174b61f784fa583595e6b Mon Sep 17 00:00:00 2001 From: Paul Johnson Date: Fri, 20 Nov 2020 11:48:32 +0000 Subject: [PATCH] UmbracoBuilder now requires TypeLoader via ctor --- src/Umbraco.Core/Builder/IUmbracoBuilder.cs | 2 +- src/Umbraco.Core/Builder/UmbracoBuilder.cs | 16 +++----- src/Umbraco.Core/Logging/ProfilingLogger.cs | 3 ++ src/Umbraco.Tests.Integration/RuntimeTests.cs | 20 +++++++--- .../UmbracoBuilderExtensions.cs | 3 +- .../UmbracoTestServerTestBase.cs | 4 +- .../Testing/UmbracoIntegrationTest.cs | 10 +++-- .../Scoping/ScopedRepositoryTests.cs | 1 + .../TestHelpers/BaseUsingSqlSyntax.cs | 4 +- .../Umbraco.Core/Components/ComponentTests.cs | 29 +++++++------- .../Composing/CollectionBuildersTests.cs | 2 +- .../Composing/LazyCollectionBuilderTests.cs | 18 ++++----- .../Composing/PackageActionCollectionTests.cs | 4 +- src/Umbraco.Tests/IO/FileSystemsTests.cs | 5 +-- .../Published/ConvertersTests.cs | 3 +- .../Scoping/ScopeEventDispatcherTests.cs | 3 +- .../TestHelpers/BaseUsingSqlCeSyntax.cs | 4 +- src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 6 +-- .../Builder/UmbracoBuilderExtensions.cs | 29 ++++++++------ .../UmbracoCoreServiceCollectionExtensions.cs | 38 +++++++++---------- 20 files changed, 106 insertions(+), 98 deletions(-) diff --git a/src/Umbraco.Core/Builder/IUmbracoBuilder.cs b/src/Umbraco.Core/Builder/IUmbracoBuilder.cs index 37298963db..4659be55f1 100644 --- a/src/Umbraco.Core/Builder/IUmbracoBuilder.cs +++ b/src/Umbraco.Core/Builder/IUmbracoBuilder.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Builder { IServiceCollection Services { get; } IConfiguration Config { get; } - TypeLoader TypeLoader { get; set; } // TODO: Remove setter, see note on concrete + TypeLoader TypeLoader { get; } ILoggerFactory BuilderLoggerFactory { get; } TBuilder WithCollectionBuilder() where TBuilder : ICollectionBuilder, new(); void Build(); diff --git a/src/Umbraco.Core/Builder/UmbracoBuilder.cs b/src/Umbraco.Core/Builder/UmbracoBuilder.cs index a633133831..28b44e15eb 100644 --- a/src/Umbraco.Core/Builder/UmbracoBuilder.cs +++ b/src/Umbraco.Core/Builder/UmbracoBuilder.cs @@ -13,27 +13,23 @@ namespace Umbraco.Web.Common.Builder { private readonly Dictionary _builders = new Dictionary(); - public UmbracoBuilder(IServiceCollection services, IConfiguration config) - : this(services, config, NullLoggerFactory.Instance) + public UmbracoBuilder(IServiceCollection services, IConfiguration config, TypeLoader typeLoader) + : this(services, config, typeLoader, NullLoggerFactory.Instance) { } - public UmbracoBuilder(IServiceCollection services, IConfiguration config, ILoggerFactory loggerFactory) + public UmbracoBuilder(IServiceCollection services, IConfiguration config, TypeLoader typeLoader, ILoggerFactory loggerFactory) { Services = services; Config = config; BuilderLoggerFactory = loggerFactory; + TypeLoader = typeLoader; } public IServiceCollection Services { get; } public IConfiguration Config { get; } - /// - /// TODO: Remove setter - /// This should be a constructor parameter - /// Attempting to fix it now opens a huge can of worms around logging setup - /// & use of IOptionsMoniker<HostingSettings> for AspNetCoreHostingEnvironment - /// - public TypeLoader TypeLoader { get; set; } + + public TypeLoader TypeLoader { get; } public ILoggerFactory BuilderLoggerFactory { get; } /// diff --git a/src/Umbraco.Core/Logging/ProfilingLogger.cs b/src/Umbraco.Core/Logging/ProfilingLogger.cs index 7bf04e3d77..e00b5d5f01 100644 --- a/src/Umbraco.Core/Logging/ProfilingLogger.cs +++ b/src/Umbraco.Core/Logging/ProfilingLogger.cs @@ -23,6 +23,9 @@ namespace Umbraco.Core.Logging /// /// Initializes a new instance of the class. /// + public ProfilingLogger(ILogger logger, IProfiler profiler) : this(logger as ILogger, profiler) + { } + public ProfilingLogger(ILogger logger, IProfiler profiler) { Logger = logger ?? throw new ArgumentNullException(nameof(logger)); diff --git a/src/Umbraco.Tests.Integration/RuntimeTests.cs b/src/Umbraco.Tests.Integration/RuntimeTests.cs index 274e3d6ad9..8b924715e5 100644 --- a/src/Umbraco.Tests.Integration/RuntimeTests.cs +++ b/src/Umbraco.Tests.Integration/RuntimeTests.cs @@ -61,10 +61,13 @@ namespace Umbraco.Tests.Integration services.AddRequiredNetCoreServices(testHelper, webHostEnvironment); // Add it! - - var builder = new UmbracoBuilder(services, hostContext.Configuration, testHelper.ConsoleLoggerFactory); + var typeLoader = UmbracoCoreServiceCollectionExtensions.CreateTypeLoader(GetType().Assembly, webHostEnvironment, + testHelper.ConsoleLoggerFactory, AppCaches.NoCache, hostContext.Configuration); + + var builder = new UmbracoBuilder(services, hostContext.Configuration, typeLoader, testHelper.ConsoleLoggerFactory); + builder.Services.AddUnique(AppCaches.NoCache); builder.AddConfiguration(); - builder.AddUmbracoCore(webHostEnvironment, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(), hostContext.Configuration); + builder.AddUmbracoCore(webHostEnvironment, GetType().Assembly, testHelper.GetLoggingConfiguration(), hostContext.Configuration); }); var host = await hostBuilder.StartAsync(); @@ -99,12 +102,17 @@ namespace Umbraco.Tests.Integration var webHostEnvironment = testHelper.GetWebHostEnvironment(); services.AddSingleton(testHelper.DbProviderFactoryCreator); services.AddRequiredNetCoreServices(testHelper, webHostEnvironment); - + // Add it! - var builder = new UmbracoBuilder(services, hostContext.Configuration, testHelper.ConsoleLoggerFactory); + var typeLoader = UmbracoCoreServiceCollectionExtensions.CreateTypeLoader(GetType().Assembly, + webHostEnvironment, testHelper.ConsoleLoggerFactory, AppCaches.NoCache, + hostContext.Configuration); + + var builder = new UmbracoBuilder(services, hostContext.Configuration, typeLoader, testHelper.ConsoleLoggerFactory); + builder.Services.AddUnique(AppCaches.NoCache); builder.AddConfiguration() - .AddUmbracoCore(webHostEnvironment, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(), hostContext.Configuration) + .AddUmbracoCore(webHostEnvironment, GetType().Assembly, testHelper.GetLoggingConfiguration(), hostContext.Configuration) .Build(); services.AddRouting(); // LinkGenerator diff --git a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs index 3595db8541..806e5ffa1d 100644 --- a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs @@ -20,10 +20,11 @@ namespace Umbraco.Tests.Integration.TestServerTest builder.AddUmbracoCore( testHelper.GetWebHostEnvironment(), typeof(UmbracoBuilderExtensions).Assembly, - AppCaches.NoCache, // Disable caches in integration tests testHelper.GetLoggingConfiguration(), builder.Config); + builder.Services.AddUnique(AppCaches.NoCache); + builder.Services.AddUnique(Mock.Of()); builder.Services.AddUnique(testHelper.MainDom); diff --git a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs index 79ab21bbb1..76424a253d 100644 --- a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs +++ b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs @@ -21,6 +21,7 @@ using Umbraco.Web; using Umbraco.Web.Common.Builder; using Umbraco.Web.Common.Controllers; using Microsoft.Extensions.Hosting; +using Umbraco.Core.Cache; using Umbraco.Core.Persistence; using Umbraco.Core.Runtime; using Umbraco.Web.BackOffice.Controllers; @@ -129,7 +130,8 @@ namespace Umbraco.Tests.Integration.TestServerTest public override void ConfigureServices(IServiceCollection services) { - var umbracoBuilder = services.AddUmbraco(TestHelper.GetWebHostEnvironment(), Configuration); + var umbracoBuilder = services.AddUmbraco(TestHelper.GetWebHostEnvironment(), Configuration, assembly: GetType().Assembly); + umbracoBuilder .AddConfiguration() .AddTestCore(TestHelper) // This is the important one! diff --git a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs index 0c45fa4841..862371c10c 100644 --- a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs +++ b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs @@ -128,7 +128,6 @@ namespace Umbraco.Tests.Integration.Testing catch { // ignored - Debugger.Break(); } return NullLoggerFactory.Instance; @@ -175,16 +174,21 @@ namespace Umbraco.Tests.Integration.Testing // Add it! - var builder = new UmbracoBuilder(services, Configuration); + var typeLoader = UmbracoCoreServiceCollectionExtensions.CreateTypeLoader(GetType().Assembly, webHostEnvironment, TestHelper.ConsoleLoggerFactory, AppCaches.NoCache, Configuration); + var builder = new UmbracoBuilder(services, Configuration, typeLoader, TestHelper.ConsoleLoggerFactory); + + builder.AddConfiguration() .AddUmbracoCore( webHostEnvironment, GetType().Assembly, - GetAppCaches(), TestHelper.GetLoggingConfiguration(), Configuration ); + builder.Services.AddUnique(GetAppCaches()); + + builder.Services.AddUnique(Mock.Of()); builder.Services.AddUnique(TestHelper.MainDom); diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs index 2976aca085..5542f926e1 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs @@ -44,6 +44,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Scoping return result; } + [TearDown] public void Teardown() { diff --git a/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs b/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs index 275ee5e5e4..4093dfb892 100644 --- a/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs +++ b/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs @@ -34,8 +34,8 @@ namespace Umbraco.Tests.TestHelpers var container = TestHelper.GetServiceCollection(); var typeLoader = TestHelper.GetMockedTypeLoader(); - var composition = new UmbracoBuilder(container, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(container, Mock.Of(), TestHelper.GetMockedTypeLoader()); + composition.WithCollectionBuilder() .AddCoreMappers(); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs index b374ee9b0e..8a276c7fcc 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs @@ -77,8 +77,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void Boot1A() { var register = MockRegister(); - var typeLoader = MockTypeLoader(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = TypeArray(); var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -118,7 +117,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void Boot1B() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = TypeArray(); var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -134,7 +133,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void Boot2() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = TypeArray(); var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -149,7 +148,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void Boot3() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = TypeArray(); var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -166,7 +165,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void BrokenRequire() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = TypeArray(); var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -189,7 +188,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void BrokenRequired() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = TypeArray(); var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -226,7 +225,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components throw new NotSupportedException(type.FullName); }); }); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = new[] { typeof(Composer1), typeof(Composer5), typeof(Composer5a) }; var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -252,7 +251,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void Requires1() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = new[] { typeof(Composer6), typeof(Composer7), typeof(Composer8) }; var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -267,7 +266,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void Requires2A() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = new[] { typeof(Composer9), typeof(Composer2), typeof(Composer4) }; var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -284,7 +283,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components var register = MockRegister(); var typeLoader = MockTypeLoader(); var factory = MockFactory(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = new[] { typeof(Composer9), typeof(Composer2), typeof(Composer4) }; var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -303,7 +302,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void WeakDependencies() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = new[] { typeof(Composer10) }; var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -342,7 +341,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void DisableMissing() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = new[] { typeof(Composer6), typeof(Composer8) }; // 8 disables 7 which is not in the list var composers = new Composers(composition, types, Enumerable.Empty(), Mock.Of>()); @@ -357,7 +356,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components public void AttributesPriorities() { var register = MockRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var types = new[] { typeof(Composer26) }; var enableDisableAttributes = new[] { new DisableComposerAttribute(typeof(Composer26)) }; @@ -383,7 +382,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components var typeLoader = new TypeLoader(typeFinder, AppCaches.Disabled.RuntimeCache, new DirectoryInfo(ioHelper.MapPath("~/App_Data/TEMP")), Mock.Of>(), Mock.Of()); var register = MockRegister(); - var builder = new UmbracoBuilder(register, Mock.Of()); + var builder = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); var allComposers = typeLoader.GetTypes().ToList(); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs index 8ed3e2fdf6..6bc33605ac 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs @@ -25,7 +25,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing public void Setup() { var register = TestHelper.GetServiceCollection(); - _composition = new UmbracoBuilder(register, Mock.Of()); + _composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); } [TearDown] diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs index a6cb34f4e4..c756023151 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs @@ -31,8 +31,8 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing public void LazyCollectionBuilderHandlesTypes() { var container = CreateRegister(); - var composition = new UmbracoBuilder(container, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(container, Mock.Of(), TestHelper.GetMockedTypeLoader()); + composition.WithCollectionBuilder() .Add() @@ -58,8 +58,8 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing public void LazyCollectionBuilderHandlesProducers() { var container = CreateRegister(); - var composition = new UmbracoBuilder(container, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(container, Mock.Of(), TestHelper.GetMockedTypeLoader()); + composition.WithCollectionBuilder() .Add(() => new[] { typeof(TransientObject3), typeof(TransientObject2) }) @@ -84,8 +84,8 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing public void LazyCollectionBuilderHandlesTypesAndProducers() { var container = CreateRegister(); - var composition = new UmbracoBuilder(container, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(container, Mock.Of(), TestHelper.GetMockedTypeLoader()); + composition.WithCollectionBuilder() .Add() @@ -111,8 +111,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing public void LazyCollectionBuilderThrowsOnIllegalTypes() { var container = CreateRegister(); - var composition = new UmbracoBuilder(container, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(container, Mock.Of(), TestHelper.GetMockedTypeLoader()); composition.WithCollectionBuilder() .Add() @@ -134,8 +133,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing public void LazyCollectionBuilderCanExcludeTypes() { var container = CreateRegister(); - var composition = new UmbracoBuilder(container, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(container, Mock.Of(), TestHelper.GetMockedTypeLoader()); composition.WithCollectionBuilder() .Add() diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs index efc22efb15..6ebd0c677a 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs @@ -25,8 +25,8 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing { var container = TestHelper.GetServiceCollection(); - var composition = new UmbracoBuilder(container, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(container, Mock.Of(), TestHelper.GetMockedTypeLoader()); + var expectedPackageActions = TypeLoader.GetPackageActions(); composition.WithCollectionBuilder() diff --git a/src/Umbraco.Tests/IO/FileSystemsTests.cs b/src/Umbraco.Tests/IO/FileSystemsTests.cs index 6ccfec9747..170e5e357e 100644 --- a/src/Umbraco.Tests/IO/FileSystemsTests.cs +++ b/src/Umbraco.Tests/IO/FileSystemsTests.cs @@ -34,9 +34,8 @@ namespace Umbraco.Tests.IO { _register = TestHelper.GetRegister(); - var composition = new UmbracoBuilder(_register, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); - + var composition = new UmbracoBuilder(_register, Mock.Of(), TestHelper.GetMockedTypeLoader()); + composition.Services.AddTransient(_ => Mock.Of()); composition.Services.AddTransient(); composition.Services.AddTransient(typeof(ILogger<>), typeof(Logger<>)); diff --git a/src/Umbraco.Tests/Published/ConvertersTests.cs b/src/Umbraco.Tests/Published/ConvertersTests.cs index 7aaefd34c6..d3c9eaf36d 100644 --- a/src/Umbraco.Tests/Published/ConvertersTests.cs +++ b/src/Umbraco.Tests/Published/ConvertersTests.cs @@ -37,8 +37,7 @@ namespace Umbraco.Tests.Published // Current.Reset(); var register = TestHelper.GetRegister(); - var composition = new UmbracoBuilder(register, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(register, Mock.Of(), TestHelper.GetMockedTypeLoader()); composition.WithCollectionBuilder() .Append() diff --git a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs index e71187e9f3..5ab6aeaa1d 100644 --- a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs @@ -40,8 +40,7 @@ namespace Umbraco.Tests.Scoping var services = TestHelper.GetRegister(); - var composition = new UmbracoBuilder(services, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(services, Mock.Of(), TestHelper.GetMockedTypeLoader()); _testObjects = new TestObjects(services); diff --git a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs index 17d38e723d..5223b43b35 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs @@ -48,8 +48,8 @@ namespace Umbraco.Tests.TestHelpers logger, false); - var composition = new UmbracoBuilder(services, Mock.Of()); - composition.TypeLoader = TestHelper.GetMockedTypeLoader(); + var composition = new UmbracoBuilder(services, Mock.Of(), TestHelper.GetMockedTypeLoader()); + services.AddUnique(_ => Mock.Of()); services.AddUnique(_ => NullLoggerFactory.Instance); diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index cc30b33002..3d1da8aa31 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -207,11 +207,7 @@ namespace Umbraco.Tests.Testing var services = TestHelper.GetRegister(); - - Builder = new UmbracoBuilder(services, Mock.Of()) - { - TypeLoader = typeLoader - }; + Builder = new UmbracoBuilder(services, Mock.Of(), TestHelper.GetMockedTypeLoader()); //TestHelper.GetConfigs().RegisterWith(register); services.AddUnique(typeof(ILoggerFactory), loggerFactory); diff --git a/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs index 1aab7695a2..973c617511 100644 --- a/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs @@ -37,7 +37,8 @@ namespace Umbraco.Web.Common.Builder IWebHostEnvironment webHostEnvironment, IConfiguration config, ILoggingConfiguration loggingConfig = null, - ILoggerFactory loggerFactory = null) + ILoggerFactory loggerFactory = null, + Assembly assembly = null) { if (services is null) throw new ArgumentNullException(nameof(services)); if (config is null) throw new ArgumentNullException(nameof(config)); @@ -47,10 +48,22 @@ namespace Umbraco.Web.Common.Builder loggingConfig ??= new LoggingConfiguration(Path.Combine(webHostEnvironment.ContentRootPath, "umbraco", "logs")); services.AddLogger(loggingConfig, config); loggerFactory ??= LoggerFactory.Create(cfg => cfg.AddSerilog(Log.Logger, false)); + assembly ??= Assembly.GetEntryAssembly(); - + IHttpContextAccessor httpContextAccessor = new HttpContextAccessor(); + services.AddSingleton(httpContextAccessor); - return new UmbracoBuilder(services, config, loggerFactory); + var requestCache = new GenericDictionaryRequestAppCache(() => httpContextAccessor.HttpContext?.Items); + var appCaches = new AppCaches( + new DeepCloneAppCache(new ObjectCacheAppCache()), + requestCache, + new IsolatedCaches(type => new DeepCloneAppCache(new ObjectCacheAppCache()))); + + services.AddUnique(appCaches); + + var typeLoader = UmbracoCoreServiceCollectionExtensions.CreateTypeLoader(assembly, webHostEnvironment, loggerFactory, appCaches, config); + + return new UmbracoBuilder(services, config, typeLoader, loggerFactory); } public static IUmbracoBuilder AddConfiguration(this IUmbracoBuilder builder) @@ -92,19 +105,11 @@ namespace Umbraco.Web.Common.Builder { var loggingConfig = new LoggingConfiguration(Path.Combine(webHostEnvironment.ContentRootPath, "umbraco", "logs")); - IHttpContextAccessor httpContextAccessor = new HttpContextAccessor(); - builder.Services.AddSingleton(httpContextAccessor); - builder.Services.AddSingleton(loggingConfig); - var requestCache = new GenericDictionaryRequestAppCache(() => httpContextAccessor.HttpContext?.Items); - var appCaches = new AppCaches( - new DeepCloneAppCache(new ObjectCacheAppCache()), - requestCache, - new IsolatedCaches(type => new DeepCloneAppCache(new ObjectCacheAppCache()))); + builder.Services.AddSingleton(loggingConfig); builder.AddUmbracoCore(webHostEnvironment, Assembly.GetEntryAssembly(), - appCaches, loggingConfig, builder.Config); diff --git a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs index c2a570e082..fb2affd045 100644 --- a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs @@ -53,7 +53,6 @@ namespace Umbraco.Extensions this IUmbracoBuilder builder, IWebHostEnvironment webHostEnvironment, Assembly entryAssembly, - AppCaches appCaches, ILoggingConfiguration loggingConfiguration, IConfiguration configuration) { @@ -78,6 +77,9 @@ namespace Umbraco.Extensions builder.Services.AddUmbracoSqlCeSupport(syntaxProviders, insertProviders, databaseCreators); builder.Services.AddUmbracoSqlServerSupport(syntaxProviders, insertProviders, databaseCreators); + builder.Services.AddUnique(factory => factory.GetRequiredService().RuntimeCache); + builder.Services.AddUnique(factory => factory.GetRequiredService().RequestCache); + var dbProviderFactoryCreator = new DbProviderFactoryCreator( DbProviderFactories.GetFactory, syntaxProviders, @@ -93,16 +95,12 @@ namespace Umbraco.Extensions var profiler = GetWebProfiler(configuration); builder.Services.AddUnique(profiler); - var profilingLogger = new ProfilingLogger(builder.BuilderLoggerFactory.CreateLogger(), profiler); - builder.Services.AddUnique(profilingLogger); - + var typeFinder = CreateTypeFinder(loggerFactory, webHostEnvironment, entryAssembly, builder.Config); + + builder.Services.AddUnique(); builder.Services.AddUnique(typeFinder); - - var typeLoader = CreateTypeLoader(typeFinder, webHostEnvironment, loggerFactory, profilingLogger, appCaches.RuntimeCache, configuration); - builder.TypeLoader = typeLoader; - builder.Services.AddUnique(typeLoader); - + builder.Services.AddUnique(builder.TypeLoader); builder.Services.AddUnique(); // after bootstrapping we let the container wire up for us. @@ -110,8 +108,6 @@ namespace Umbraco.Extensions builder.Services.AddUnique(factory => factory.GetRequiredService().SqlContext); builder.Services.AddUnique(factory => factory.GetRequiredService().BulkSqlInsertProvider); - builder.Services.AddUnique(appCaches); - builder.Services.AddUnique(appCaches.RequestCache); builder.Services.AddUnique(); builder.Services.AddUnique(dbProviderFactoryCreator); @@ -125,8 +121,8 @@ namespace Umbraco.Extensions var connectionStrings = factory.GetRequiredService>().Value; var hostingEnvironment = factory.GetRequiredService(); - var dbCreator = factory.GetRequiredService() - ; var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + var dbCreator = factory.GetRequiredService(); + var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); return globalSettings.MainDomLock.Equals("SqlMainDomLock") || isWindows == false ? (IMainDomLock)new SqlMainDomLock(builder.BuilderLoggerFactory.CreateLogger(), builder.BuilderLoggerFactory, globalSettings, connectionStrings, dbCreator, hostingEnvironment) @@ -328,14 +324,14 @@ namespace Umbraco.Extensions return webProfiler; } - private static ITypeFinder CreateTypeFinder(ILoggerFactory loggerFactory, IWebHostEnvironment webHostEnvironment, Assembly entryAssembly, IConfiguration config) + internal static ITypeFinder CreateTypeFinder(ILoggerFactory loggerFactory, IWebHostEnvironment webHostEnvironment, Assembly entryAssembly, IConfiguration config) { var profiler = GetWebProfiler(config); var typeFinderSettings = config.GetSection(Core.Constants.Configuration.ConfigTypeFinder).Get() ?? new TypeFinderSettings(); var runtimeHashPaths = new RuntimeHashPaths().AddFolder(new DirectoryInfo(Path.Combine(webHostEnvironment.ContentRootPath, "bin"))); - var runtimeHash = new RuntimeHash(new ProfilingLogger(loggerFactory.CreateLogger("RuntimeHash"), profiler), runtimeHashPaths); + var runtimeHash = new RuntimeHash(new ProfilingLogger(loggerFactory.CreateLogger(), profiler), runtimeHashPaths); return new TypeFinder( loggerFactory.CreateLogger(), @@ -345,20 +341,22 @@ namespace Umbraco.Extensions ); } - private static TypeLoader CreateTypeLoader( - ITypeFinder typeFinder, + internal static TypeLoader CreateTypeLoader( + Assembly entryAssembly, IWebHostEnvironment webHostEnvironment, ILoggerFactory loggerFactory, - IProfilingLogger profilingLogger, - IAppPolicyCache runtimeCache, + AppCaches appCaches, IConfiguration configuration) { + var typeFinder = CreateTypeFinder(loggerFactory, webHostEnvironment, entryAssembly, configuration); var hostingSettings = configuration.GetSection(Core.Constants.Configuration.ConfigHosting).Get() ?? new HostingSettings(); var hostingEnvironment = new AspNetCoreHostingEnvironmentWithoutOptionsMonitor(hostingSettings, webHostEnvironment); + var profilingLogger = new ProfilingLogger(loggerFactory.CreateLogger(), GetWebProfiler(configuration)); + return new TypeLoader( typeFinder, - runtimeCache, + appCaches.RuntimeCache, new DirectoryInfo(hostingEnvironment.LocalTempPath), loggerFactory.CreateLogger(), profilingLogger