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 Logger => Factory.GetRequiredService>(); public static ILoggerFactory LoggerFactory => Factory.GetRequiredService(); public static IProfiler Profiler => Factory.GetRequiredService(); public static IProfilerHtml ProfilerHtml => Factory.GetRequiredService(); public static IProfilingLogger ProfilingLogger => Factory.GetRequiredService(); public static AppCaches AppCaches => Factory.GetRequiredService(); public static ServiceContext Services => Factory.GetRequiredService(); public static IScopeProvider ScopeProvider => Factory.GetRequiredService(); public static IPublishedContentTypeFactory PublishedContentTypeFactory => Factory.GetRequiredService(); public static IPublishedValueFallback PublishedValueFallback => Factory.GetRequiredService(); public static IVariationContextAccessor VariationContextAccessor => Factory.GetRequiredService(); public static IIOHelper IOHelper => Factory.GetRequiredService(); public static IHostingEnvironment HostingEnvironment => Factory.GetRequiredService(); public static IIpResolver IpResolver => Factory.GetRequiredService(); public static IUmbracoVersion UmbracoVersion => Factory.GetRequiredService(); public static IPublishedUrlProvider PublishedUrlProvider => Factory.GetRequiredService(); public static IMenuItemCollectionFactory MenuItemCollectionFactory => Factory.GetRequiredService(); public static MembershipHelper MembershipHelper => Factory.GetRequiredService(); public static IUmbracoApplicationLifetime UmbracoApplicationLifetime => Factory.GetRequiredService(); public static IPublishedContentQuery PublishedContentQuery => Factory.GetRequiredService(); #endregion } }