using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
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.HealthCheck;
using Umbraco.Core.Hosting;
using Umbraco.Core.Mapping;
using Umbraco.Core.Templates;
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.Security;
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 IServiceProvider _factory;
///
/// Gets or sets the factory.
///
public static IServiceProvider Factory
{
get
{
if (_factory == null)
throw new InvalidOperationException("No factory has been set.");
return _factory;
}
set
{
_factory = value;
}
}
private static IUmbracoContextAccessor _umbracoContextAccessor;
#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.GetRequiredService();
}
set => _umbracoContextAccessor = value; // for tests
}
#endregion
#region Web Getters
public static IUmbracoContext UmbracoContext
=> UmbracoContextAccessor.UmbracoContext;
public static IBackOfficeSecurityAccessor BackOfficeSecurityAccessor
=> Factory.GetRequiredService();
public static UmbracoHelper UmbracoHelper
=> Factory.GetRequiredService();
public static IUmbracoComponentRenderer UmbracoComponentRenderer
=> Factory.GetRequiredService();
public static ITagQuery TagQuery
=> Factory.GetRequiredService();
public static IRuntimeMinifier RuntimeMinifier
=> Factory.GetRequiredService();
public static DistributedCache DistributedCache
=> Factory.GetRequiredService();
public static IPublishedSnapshot PublishedSnapshot
=> Factory.GetRequiredService().PublishedSnapshot;
public static EventMessages EventMessages
=> Factory.GetRequiredService().GetOrDefault();
public static UrlProviderCollection UrlProviders
=> Factory.GetRequiredService();
public static MediaUrlProviderCollection MediaUrlProviders
=> Factory.GetRequiredService();
public static HealthCheckCollectionBuilder HealthCheckCollectionBuilder
=> Factory.GetRequiredService();
internal static ActionCollectionBuilder ActionCollectionBuilder
=> Factory.GetRequiredService();
public static ActionCollection Actions
=> Factory.GetRequiredService();
public static ContentFinderCollection ContentFinders
=> Factory.GetRequiredService();
public static IContentLastChanceFinder LastChanceContentFinder
=> Factory.GetRequiredService();
internal static EditorValidatorCollection EditorValidators
=> Factory.GetRequiredService();
internal static UmbracoApiControllerTypeCollection UmbracoApiControllerTypes
=> Factory.GetRequiredService();
internal static IPublishedSnapshotService PublishedSnapshotService
=> Factory.GetRequiredService();
public static ITreeService TreeService
=> Factory.GetRequiredService();
public static ISectionService SectionService
=> Factory.GetRequiredService();
public static IIconService IconService
=> Factory.GetRequiredService();
#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() == 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.GetRequiredService();
public static UmbracoMapper Mapper => Factory.GetRequiredService();
public static IRuntimeState RuntimeState => Factory.GetRequiredService();
public static CacheRefresherCollection CacheRefreshers => Factory.GetRequiredService();
internal static IPublishedModelFactory PublishedModelFactory => Factory.GetRequiredService();
public static IServerMessenger ServerMessenger => Factory.GetRequiredService();
public static ILogger