using System.Linq; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Diagnostics; using Umbraco.Core.Hosting; using Umbraco.Core.Logging; using Umbraco.Core.Runtime; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Extensions; using Umbraco.Net; using Umbraco.Web.Common.AspNetCore; using Umbraco.Web.Common.Controllers; using Umbraco.Web.Common.Formatters; using Umbraco.Web.Common.Install; using Umbraco.Web.Common.Lifetime; using Umbraco.Web.Common.Macros; using Umbraco.Web.Common.Middleware; using Umbraco.Web.Common.ModelBinding; using Umbraco.Web.Common.Profiler; using Umbraco.Web.Common.Routing; using Umbraco.Web.Common.Security; using Umbraco.Web.Common.Templates; using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Web.Macros; using Umbraco.Web.Security; using Umbraco.Web.Templates; namespace Umbraco.Web.Common.Runtime { /// /// Adds/replaces AspNetCore specific services /// [ComposeBefore(typeof(ICoreComposer))] [ComposeAfter(typeof(CoreInitialComposer))] public class AspNetCoreComposer : ComponentComposer, IComposer { public override void Compose(Composition composition) { base.Compose(composition); // AspNetCore specific services composition.Services.AddUnique(); composition.Services.AddUnique(); // Our own netcore implementations composition.Services.AddMultipleUnique(); composition.Services.AddUnique(); // The umbraco request lifetime composition.Services.AddMultipleUnique(); // Password hasher composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddTransient(); composition.Services.AddUnique(); composition.Services.AddMultipleUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); // register the umbraco context factory composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); //register the install components //NOTE: i tried to not have these registered if we weren't installing or upgrading but post install when the site restarts //it still needs to use the install controller so we can't do that // TODO: MSDI we can fix that composition.ComposeInstaller(); var umbracoApiControllerTypes = composition.TypeLoader.GetUmbracoApiControllers().ToList(); composition.WithCollectionBuilder() .Add(umbracoApiControllerTypes); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(); composition.Services.AddUnique(factory => new LegacyPasswordSecurity()); } } }