public override void Compose(Composition composition) { base.Compose(composition); // composers composition .ComposeConfiguration() .ComposeRepositories() .ComposeServices() .ComposeCoreMappingProfiles() .ComposeFileSystems(); // register persistence mappers - required by database factory so needs to be done here // means the only place the collection can be modified is in a runtime - afterwards it // has been frozen and it is too late composition.Mappers().AddCoreMappers(); // register the scope provider composition.RegisterUnique <ScopeProvider>(); // implements both IScopeProvider and IScopeAccessor composition.RegisterUnique <IScopeProvider>(f => f.GetInstance <ScopeProvider>()); composition.RegisterUnique <IScopeAccessor>(f => f.GetInstance <ScopeProvider>()); // register database builder // *not* a singleton, don't want to keep it around composition.Register <DatabaseBuilder>(); // register manifest parser, will be injected in collection builders where needed composition.RegisterUnique <ManifestParser>(); // register our predefined validators composition.ManifestValueValidators() .Add <RequiredValidator>() .Add <RegexValidator>() .Add <DelimitedValueValidator>() .Add <EmailValidator>() .Add <IntegerValidator>() .Add <DecimalValidator>(); // register the manifest filter collection builder (collection is empty by default) composition.ManifestFilters(); // properties and parameters derive from data editors composition.DataEditors() .Add(() => composition.TypeLoader.GetDataEditors()); composition.RegisterUnique <PropertyEditorCollection>(); composition.RegisterUnique <ParameterEditorCollection>(); // Used to determine if a datatype/editor should be storing/tracking // references to media item/s composition.DataValueReferenceFactories(); // register a server registrar, by default it's the db registrar composition.RegisterUnique <IServerRegistrar>(f => { // TODO: this is a hack, use proper configuration! // also: we still register the full IServerMessenger because // even on 1 single server we can have 2 concurrent app domains var singleServer = "true".InvariantEquals(ConfigurationManager.AppSettings[Constants.AppSettings.DisableElectionForSingleServer]); return(singleServer ? (IServerRegistrar) new SingleServerRegistrar(f.GetInstance <IRuntimeState>()) : new DatabaseServerRegistrar( new Lazy <IServerRegistrationService>(f.GetInstance <IServerRegistrationService>), new DatabaseServerRegistrarOptions())); }); // by default we'll use the database server messenger with default options (no callbacks), // this will be overridden by the db thing in the corresponding components in the web // project composition.RegisterUnique <IServerMessenger>(factory => new DatabaseServerMessenger( factory.GetInstance <IRuntimeState>(), factory.GetInstance <IScopeProvider>(), factory.GetInstance <ISqlContext>(), factory.GetInstance <IProfilingLogger>(), factory.GetInstance <IGlobalSettings>(), true, new DatabaseServerMessengerOptions())); composition.CacheRefreshers() .Add(() => composition.TypeLoader.GetCacheRefreshers()); composition.PackageActions() .Add(() => composition.TypeLoader.GetPackageActions()); composition.PropertyValueConverters() .Append(composition.TypeLoader.GetTypes <IPropertyValueConverter>()); composition.RegisterUnique <IPublishedContentTypeFactory, PublishedContentTypeFactory>(); composition.RegisterUnique <IShortStringHelper>(factory => new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(factory.GetInstance <IUmbracoSettingsSection>()))); composition.UrlSegmentProviders() .Append <DefaultUrlSegmentProvider>(); composition.RegisterUnique <IMigrationBuilder>(factory => new MigrationBuilder(factory)); // by default, register a noop factory composition.RegisterUnique <IPublishedModelFactory, NoopPublishedModelFactory>(); // by default, register a noop rebuilder composition.RegisterUnique <IPublishedSnapshotRebuilder, PublishedSnapshotRebuilder>(); // will be injected in controllers when needed to invoke rest endpoints on Our composition.RegisterUnique <IInstallationService, InstallationService>(); composition.RegisterUnique <IUpgradeService, UpgradeService>(); }