using System; using System.Collections.Generic; using System.Configuration; using System.IO; using AutoMapper; using LightInject; using Umbraco.Core.Cache; using Umbraco.Core.Components; using Umbraco.Core.Composing; using Umbraco.Core.Composing.CompositionRoots; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Manifest; using Umbraco.Core.Migrations; using Umbraco.Core.Migrations.Install; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Scoping; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Core.Sync; using Umbraco.Core._Legacy.PackageActions; using IntegerValidator = Umbraco.Core.PropertyEditors.IntegerValidator; namespace Umbraco.Core.Runtime { public class CoreRuntimeComponent : UmbracoComponentBase, IRuntimeComponent { public override void Compose(Composition composition) { base.Compose(composition); // register from roots composition.Container.RegisterFrom(); composition.Container.RegisterFrom(); composition.Container.RegisterFrom(); composition.Container.RegisterFrom(); // register database builder // *not* a singleton, don't want to keep it around composition.Container.Register(); // register filesystems composition.Container.RegisterSingleton(); composition.Container.RegisterSingleton(factory => factory.GetInstance().MediaFileSystem); composition.Container.RegisterSingleton(factory => factory.GetInstance().ScriptsFileSystem, Constants.Composing.FileSystems.ScriptFileSystem); composition.Container.RegisterSingleton(factory => factory.GetInstance().PartialViewsFileSystem, Constants.Composing.FileSystems.PartialViewFileSystem); composition.Container.RegisterSingleton(factory => factory.GetInstance().MacroPartialsFileSystem, Constants.Composing.FileSystems.PartialViewMacroFileSystem); composition.Container.RegisterSingleton(factory => factory.GetInstance().StylesheetsFileSystem, Constants.Composing.FileSystems.StylesheetFileSystem); composition.Container.RegisterSingleton(factory => factory.GetInstance().MasterPagesFileSystem, Constants.Composing.FileSystems.MasterpageFileSystem); composition.Container.RegisterSingleton(factory => factory.GetInstance().MvcViewsFileSystem, Constants.Composing.FileSystems.ViewFileSystem); composition.Container.RegisterSingleton(factory => factory.GetInstance().XsltFileSystem, Constants.Composing.FileSystems.XsltFileSystem); // register manifest builder, will be injected in eg PropertyEditorCollectionBuilder composition.Container.RegisterSingleton(); composition.Container.RegisterCollectionBuilder() .Add(factory => factory.GetInstance().GetPropertyEditors()); composition.Container.RegisterCollectionBuilder() .Add(factory => factory.GetInstance().GetParameterEditors()); // register our predefined validators composition.Container.RegisterCollectionBuilder() .Add() .Add() .Add() .Add() .Add() .Add(); // register a server registrar, by default it's the db registrar unless the dev // has the legacy dist calls enabled - fixme - should obsolete the legacy thing composition.Container.RegisterSingleton(f => { if (UmbracoConfig.For.UmbracoSettings().DistributedCall.Enabled) return new ConfigServerRegistrar(UmbracoConfig.For.UmbracoSettings(), f.GetInstance()); if ("true".InvariantEquals(ConfigurationManager.AppSettings["umbracoDisableElectionForSingleServer"])) return new SingleServerRegistrar(f.GetInstance()); return new DatabaseServerRegistrar( new Lazy(f.GetInstance), new DatabaseServerRegistrarOptions()); }); // by default we'll use the database server messenger with default options (no callbacks), // this will be overridden by either the legacy thing or the db thing in the corresponding // components in the web project - fixme - should obsolete the legacy thing composition.Container.RegisterSingleton(factory => new DatabaseServerMessenger( factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), true, new DatabaseServerMessengerOptions())); composition.Container.RegisterCollectionBuilder() .Add(factory => factory.GetInstance().GetCacheRefreshers()); composition.Container.RegisterCollectionBuilder() .Add(f => f.GetInstance().GetPackageActions()); // need to filter out the ones we dont want!! fixme - what does that mean? composition.Container.RegisterCollectionBuilder() .Append(factory => factory.GetInstance().GetTypes()); composition.Container.Register(new PerContainerLifetime()); composition.Container.Register(new PerContainerLifetime()); composition.Container.RegisterSingleton(factory => new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(factory.GetInstance()))); composition.Container.RegisterCollectionBuilder() .Append(); composition.Container.RegisterCollectionBuilder() .Add(factory => factory.GetInstance().GetTypes()); composition.Container.RegisterSingleton(); // by default, register a noop factory composition.Container.RegisterSingleton(); } internal void Initialize(IEnumerable mapperProfiles) { //TODO: Remove these for v8! LegacyPropertyEditorIdToAliasConverter.CreateMappingsForCoreEditors(); LegacyParameterEditorAliasConverter.CreateMappingsForCoreEditors(); // mapper profiles have been registered & are created by the container Mapper.Initialize(configuration => { foreach (var profile in mapperProfiles) configuration.AddProfile(profile); }); // ensure we have some essential directories // every other component can then initialize safely IOHelper.EnsurePathExists("~/App_Data"); IOHelper.EnsurePathExists(SystemDirectories.Media); IOHelper.EnsurePathExists(SystemDirectories.MvcViews); IOHelper.EnsurePathExists(SystemDirectories.MvcViews + "/Partials"); IOHelper.EnsurePathExists(SystemDirectories.MvcViews + "/MacroPartials"); } } }