Merge remote-tracking branch 'origin/v10/dev' into v10/feature/nullable-reference-types-in-Umbraco-Core

# Conflicts:
#	build/build.ps1
#	src/Umbraco.Core/Configuration/ConfigConnectionString.cs
#	src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs
#	src/Umbraco.Core/Install/InstallSteps/TelemetryIdentifierStep.cs
#	src/Umbraco.Core/Models/ContentType.cs
#	src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs
#	tests/Umbraco.Tests.AcceptanceTest/package.json
This commit is contained in:
Nikolaj Geisle
2022-03-16 13:00:38 +01:00
480 changed files with 11569 additions and 6721 deletions

View File

@@ -31,7 +31,7 @@ namespace Umbraco.Cms.Core.DependencyInjection
IProfiler Profiler { get; }
AppCaches AppCaches { get; }
TBuilder WithCollectionBuilder<TBuilder>() where TBuilder : ICollectionBuilder, new();
TBuilder WithCollectionBuilder<TBuilder>() where TBuilder : ICollectionBuilder;
void Build();
}
}

View File

@@ -46,7 +46,8 @@ namespace Umbraco.Cms.Core.DependencyInjection
.Append<ContentTypeListViewContentAppFactory>()
.Append<ContentTypePermissionsContentAppFactory>()
.Append<ContentTypeTemplatesContentAppFactory>()
.Append<MemberEditorContentAppFactory>();
.Append<MemberEditorContentAppFactory>()
.Append<DictionaryContentAppFactory>();
// all built-in finders in the correct order,
// devs can then modify this list on application startup

View File

@@ -90,6 +90,8 @@ namespace Umbraco.Cms.Core.DependencyInjection
.AddUmbracoOptions<ContentDashboardSettings>()
.AddUmbracoOptions<HelpPageSettings>();
builder.Services.AddSingleton<IConfigureOptions<ConnectionStrings>, ConfigureConnectionStrings>();
builder.Services.Configure<RequestHandlerSettings>(options => options.MergeReplacements(builder.Config));
return builder;

View File

@@ -103,7 +103,7 @@ namespace Umbraco.Cms.Core.DependencyInjection
/// <typeparam name="TBuilder">The type of the collection builder.</typeparam>
/// <returns>The collection builder.</returns>
public TBuilder WithCollectionBuilder<TBuilder>()
where TBuilder : ICollectionBuilder, new()
where TBuilder : ICollectionBuilder
{
Type typeOfBuilder = typeof(TBuilder);
@@ -112,7 +112,22 @@ namespace Umbraco.Cms.Core.DependencyInjection
return (TBuilder)o;
}
var builder = new TBuilder();
TBuilder builder;
if (typeof(TBuilder).GetConstructor(Type.EmptyTypes) != null)
{
builder = Activator.CreateInstance<TBuilder>();
}
else if (typeof(TBuilder).GetConstructor(new[] { typeof(IUmbracoBuilder) }) != null)
{
// Handle those collection builders which need a reference to umbraco builder i.e. DistributedLockingCollectionBuilder.
builder = (TBuilder)Activator.CreateInstance(typeof(TBuilder), this);
}
else
{
throw new InvalidOperationException("A CollectionBuilder must have either a parameterless constructor or a constructor whose only parameter is of type IUmbracoBuilder");
}
_builders[typeOfBuilder] = builder;
return builder;
}
@@ -265,6 +280,7 @@ namespace Umbraco.Cms.Core.DependencyInjection
Services.AddSingleton<IValueEditorCache, ValueEditorCache>();
// Register telemetry service used to gather data about installed packages
Services.AddUnique<ISiteIdentifierService, SiteIdentifierService>();
Services.AddUnique<ITelemetryService, TelemetryService>();
Services.AddUnique<IKeyValueService, KeyValueService>();
@@ -291,6 +307,7 @@ namespace Umbraco.Cms.Core.DependencyInjection
Services.AddUnique<IRelationService, RelationService>();
Services.AddUnique<IMemberTypeService, MemberTypeService>();
Services.AddUnique<INotificationService, NotificationService>();
Services.AddUnique<ITrackedReferencesService, TrackedReferencesService>();
Services.AddUnique<ExternalLoginService>(factory => new ExternalLoginService(
factory.GetRequiredService<IScopeProvider>(),
factory.GetRequiredService<ILoggerFactory>(),