Files
Umbraco-CMS/src/Umbraco.Web/Composing/Current.cs
Bjarke Berg bd534d340e Merge remote-tracking branch 'origin/v8/dev' into netcore/dev
Signed-off-by: Bjarke Berg <mail@bergmania.dk>

# Conflicts:
#	src/Umbraco.Infrastructure/Services/Implement/IIconService.cs
#	src/Umbraco.Infrastructure/Services/Implement/IconService.cs
#	src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml
#	src/Umbraco.Web/Editors/BackOfficeController.cs
#	src/Umbraco.Web/Editors/BackOfficeModel.cs
#	src/Umbraco.Web/Editors/BackOfficePreviewModel.cs
#	src/Umbraco.Web/Editors/IconController.cs
#	src/Umbraco.Web/Editors/PreviewController.cs
#	src/Umbraco.Web/Runtime/WebInitialComposer.cs
2020-09-22 12:38:36 +02:00

287 lines
11 KiB
C#

using System;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Dictionary;
using Umbraco.Core.Events;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Persistence;
using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Hosting;
using Umbraco.Core.Mapping;
using Umbraco.Net;
using Umbraco.Core.PackageActions;
using Umbraco.Core.Packaging;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Runtime;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Core.Sync;
using Umbraco.Core.WebAssets;
using Umbraco.Web.Actions;
using Umbraco.Web.Cache;
using Umbraco.Web.Editors;
using Umbraco.Web.HealthCheck;
using Umbraco.Web.Mvc;
using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
using Umbraco.Web.Security;
using Umbraco.Web.Services;
using Umbraco.Web.Trees;
using Umbraco.Web.WebApi;
namespace Umbraco.Web.Composing
{
// see notes in Umbraco.Core.Composing.Current.
public static class Current
{
private static readonly object Locker = new object();
private static IFactory _factory;
/// <summary>
/// Gets or sets the factory.
/// </summary>
public static IFactory Factory
{
get
{
if (_factory == null)
throw new InvalidOperationException("No factory has been set.");
return _factory;
}
set
{
if (_factory != null)
throw new InvalidOperationException("A factory has already been set.");
_factory = value;
}
}
private static IUmbracoContextAccessor _umbracoContextAccessor;
static Current()
{
Resetted += (sender, args) =>
{
if (_umbracoContextAccessor != null)
{
var umbracoContext = _umbracoContextAccessor.UmbracoContext;
umbracoContext?.Dispose();
}
_umbracoContextAccessor = null;
};
}
/// <summary>
/// for UNIT TESTS exclusively! Resets <see cref="Current"/>. Indented for testing only, and not supported in production code.
/// </summary>
/// <remarks>
/// <para>For UNIT TESTS exclusively.</para>
/// <para>Resets everything that is 'current'.</para>
/// </remarks>
public static void Reset()
{
_factory.DisposeIfDisposable();
_factory = null;
Resetted?.Invoke(null, EventArgs.Empty);
}
internal static event EventHandler Resetted;
#region Temp & Special
// TODO: have to keep this until tests are refactored
// but then, it should all be managed properly in the container
public static IUmbracoContextAccessor UmbracoContextAccessor
{
get
{
if (_umbracoContextAccessor != null) return _umbracoContextAccessor;
return _umbracoContextAccessor = Factory.GetInstance<IUmbracoContextAccessor>();
}
set => _umbracoContextAccessor = value; // for tests
}
#endregion
#region Web Getters
public static IUmbracoContext UmbracoContext
=> UmbracoContextAccessor.UmbracoContext;
public static UmbracoHelper UmbracoHelper
=> Factory.GetInstance<UmbracoHelper>();
public static IUmbracoComponentRenderer UmbracoComponentRenderer
=> Factory.GetInstance<IUmbracoComponentRenderer>();
public static ITagQuery TagQuery
=> Factory.GetInstance<ITagQuery>();
public static IRuntimeMinifier RuntimeMinifier
=> Factory.GetInstance<IRuntimeMinifier>();
public static DistributedCache DistributedCache
=> Factory.GetInstance<DistributedCache>();
public static IPublishedSnapshot PublishedSnapshot
=> Factory.GetInstance<IPublishedSnapshotAccessor>().PublishedSnapshot;
public static EventMessages EventMessages
=> Factory.GetInstance<IEventMessagesFactory>().GetOrDefault();
public static UrlProviderCollection UrlProviders
=> Factory.GetInstance<UrlProviderCollection>();
public static MediaUrlProviderCollection MediaUrlProviders
=> Factory.GetInstance<MediaUrlProviderCollection>();
public static HealthCheckCollectionBuilder HealthCheckCollectionBuilder
=> Factory.GetInstance<HealthCheckCollectionBuilder>();
internal static ActionCollectionBuilder ActionCollectionBuilder
=> Factory.GetInstance<ActionCollectionBuilder>();
public static ActionCollection Actions
=> Factory.GetInstance<ActionCollection>();
public static ContentFinderCollection ContentFinders
=> Factory.GetInstance<ContentFinderCollection>();
public static IContentLastChanceFinder LastChanceContentFinder
=> Factory.GetInstance<IContentLastChanceFinder>();
internal static EditorValidatorCollection EditorValidators
=> Factory.GetInstance<EditorValidatorCollection>();
internal static UmbracoApiControllerTypeCollection UmbracoApiControllerTypes
=> Factory.GetInstance<UmbracoApiControllerTypeCollection>();
internal static SurfaceControllerTypeCollection SurfaceControllerTypes
=> Factory.GetInstance<SurfaceControllerTypeCollection>();
public static FilteredControllerFactoryCollection FilteredControllerFactories
=> Factory.GetInstance<FilteredControllerFactoryCollection>();
internal static IPublishedSnapshotService PublishedSnapshotService
=> Factory.GetInstance<IPublishedSnapshotService>();
public static ITreeService TreeService
=> Factory.GetInstance<ITreeService>();
public static ISectionService SectionService
=> Factory.GetInstance<ISectionService>();
public static IIconService IconService
=> Factory.GetInstance<IIconService>();
#endregion
#region Web Constants
// these are different - not 'resolving' anything, and nothing that could be managed
// by the container - just registering some sort of application-wide constants or
// settings - but they fit in Current nicely too
private static Type _defaultRenderMvcControllerType;
// internal - can only be accessed through Composition at compose time
internal static Type DefaultRenderMvcControllerType
{
get => _defaultRenderMvcControllerType;
set
{
if (value.Implements<IRenderController>() == false)
throw new ArgumentException($"Type {value.FullName} does not implement {typeof(IRenderController).FullName}.", nameof(value));
_defaultRenderMvcControllerType = value;
}
}
#endregion
#region Core Getters
// proxy Core for convenience
public static IMediaFileSystem MediaFileSystem => Factory.GetInstance<IMediaFileSystem>();
public static UmbracoMapper Mapper => Factory.GetInstance<UmbracoMapper>();
public static IRuntimeState RuntimeState => Factory.GetInstance<IRuntimeState>();
public static TypeLoader TypeLoader => Factory.GetInstance<TypeLoader>();
public static Configs Configs => Factory.GetInstance<Configs>();
public static UrlSegmentProviderCollection UrlSegmentProviders => Factory.GetInstance<UrlSegmentProviderCollection>();
public static CacheRefresherCollection CacheRefreshers => Factory.GetInstance<CacheRefresherCollection>();
public static DataEditorCollection DataEditors => Factory.GetInstance<DataEditorCollection>();
public static DataValueReferenceFactoryCollection DataValueReferenceFactories => Factory.GetInstance<DataValueReferenceFactoryCollection>();
public static PropertyEditorCollection PropertyEditors => Factory.GetInstance<PropertyEditorCollection>();
public static ParameterEditorCollection ParameterEditors => Factory.GetInstance<ParameterEditorCollection>();
internal static ManifestValueValidatorCollection ManifestValidators => Factory.GetInstance<ManifestValueValidatorCollection>();
internal static IPackageActionRunner PackageActionRunner => Factory.GetInstance<IPackageActionRunner>();
internal static PackageActionCollection PackageActions => Factory.GetInstance<PackageActionCollection>();
internal static PropertyValueConverterCollection PropertyValueConverters => Factory.GetInstance<PropertyValueConverterCollection>();
internal static IPublishedModelFactory PublishedModelFactory => Factory.GetInstance<IPublishedModelFactory>();
public static IServerMessenger ServerMessenger => Factory.GetInstance<IServerMessenger>();
public static IServerRegistrar ServerRegistrar => Factory.GetInstance<IServerRegistrar>();
public static ICultureDictionaryFactory CultureDictionaryFactory => Factory.GetInstance<ICultureDictionaryFactory>();
public static IShortStringHelper ShortStringHelper => Factory.GetInstance<IShortStringHelper>();
public static ILogger Logger => Umbraco.Composing.Current.Logger;
public static IProfiler Profiler => Factory.GetInstance<IProfiler>();
public static IProfilerHtml ProfilerHtml => Factory.GetInstance<IProfilerHtml>();
public static IProfilingLogger ProfilingLogger => Factory.GetInstance<IProfilingLogger>();
public static AppCaches AppCaches => Factory.GetInstance<AppCaches>();
public static ServiceContext Services => Factory.GetInstance<ServiceContext>();
public static IScopeProvider ScopeProvider => Factory.GetInstance<IScopeProvider>();
public static IFileSystems FileSystems => Factory.GetInstance<IFileSystems>();
public static ISqlContext SqlContext => Factory.GetInstance<ISqlContext>();
public static IPublishedContentTypeFactory PublishedContentTypeFactory => Factory.GetInstance<IPublishedContentTypeFactory>();
public static IPublishedValueFallback PublishedValueFallback => Factory.GetInstance<IPublishedValueFallback>();
public static IVariationContextAccessor VariationContextAccessor => Factory.GetInstance<IVariationContextAccessor>();
public static IIOHelper IOHelper => Factory.GetInstance<IIOHelper>();
public static IHostingEnvironment HostingEnvironment => Factory.GetInstance<IHostingEnvironment>();
public static IIpResolver IpResolver => Factory.GetInstance<IIpResolver>();
public static IUmbracoVersion UmbracoVersion => Factory.GetInstance<IUmbracoVersion>();
public static IPublishedUrlProvider PublishedUrlProvider => Factory.GetInstance<IPublishedUrlProvider>();
public static IMenuItemCollectionFactory MenuItemCollectionFactory => Factory.GetInstance<IMenuItemCollectionFactory>();
public static MembershipHelper MembershipHelper => Factory.GetInstance<MembershipHelper>();
public static IUmbracoApplicationLifetime UmbracoApplicationLifetime => Factory.GetInstance<IUmbracoApplicationLifetime>();
public static IPublishedContentQuery PublishedContentQuery => Factory.GetInstance<IPublishedContentQuery>();
#endregion
}
}