Adjust how the umbraco builder works

This commit is contained in:
Shannon
2021-07-26 09:23:34 -06:00
parent ab66a9f33c
commit 5c59b54b6e
3 changed files with 41 additions and 35 deletions

View File

@@ -5,14 +5,14 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
public interface IUmbracoApplicationBuilder
{
/// <summary>
/// EXPERT/OPTIONAL call to replace the default middlewares that Umbraco installs by default.
/// EXPERT call to replace the middlewares that Umbraco installs by default with a completely custom pipeline.
/// </summary>
/// <param name="configureUmbracoMiddleware"></param>
/// <returns></returns>
IUmbracoApplicationBuilder WithCustomDefaultMiddleware(Action<IUmbracoApplicationBuilderContext> configureUmbracoMiddleware);
IUmbracoEndpointBuilder WithCustomMiddleware(Action<IUmbracoApplicationBuilderContext> configureUmbracoMiddleware);
/// <summary>
/// Called to include umbraco middleware
/// Called to include default middleware to run umbraco.
/// </summary>
/// <param name="configureUmbracoMiddleware"></param>
/// <returns></returns>

View File

@@ -5,6 +5,11 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
public interface IUmbracoApplicationBuilderContext : IUmbracoApplicationBuilderServices
{
Action RegisterDefaultRequiredMiddleware { get; }
void UseUmbracoCoreMiddleware();
void RunPrePipeline();
void RunPostPipeline();
void RegisterDefaultRequiredMiddleware();
}
}

View File

@@ -13,25 +13,30 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
/// </summary>
public class UmbracoApplicationBuilder : IUmbracoApplicationBuilder, IUmbracoEndpointBuilder, IUmbracoApplicationBuilderContext
{
private Action<IUmbracoApplicationBuilderContext> _customMiddlewareRegistration;
private readonly IOptions<UmbracoPipelineOptions> _umbracoPipelineStartupOptions;
public UmbracoApplicationBuilder(IApplicationBuilder appBuilder)
{
ApplicationServices = appBuilder.ApplicationServices;
RuntimeState = appBuilder.ApplicationServices.GetRequiredService<IRuntimeState>();
AppBuilder = appBuilder ?? throw new ArgumentNullException(nameof(appBuilder));
RegisterDefaultRequiredMiddleware = RegisterRequiredMiddleware;
_umbracoPipelineStartupOptions = ApplicationServices.GetRequiredService<IOptions<UmbracoPipelineOptions>>();
}
public IServiceProvider ApplicationServices { get; }
public IRuntimeState RuntimeState { get; }
public IApplicationBuilder AppBuilder { get; }
public Action RegisterDefaultRequiredMiddleware { get; set; }
/// <inheritdoc />
public IUmbracoApplicationBuilder WithCustomDefaultMiddleware(Action<IUmbracoApplicationBuilderContext> configureUmbracoMiddleware)
public IUmbracoEndpointBuilder WithCustomMiddleware(Action<IUmbracoApplicationBuilderContext> configureUmbracoMiddleware)
{
_customMiddlewareRegistration = configureUmbracoMiddleware;
if (configureUmbracoMiddleware is null)
{
throw new ArgumentNullException(nameof(configureUmbracoMiddleware));
}
configureUmbracoMiddleware(this);
return this;
}
@@ -43,20 +48,11 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
throw new ArgumentNullException(nameof(configureUmbracoMiddleware));
}
IOptions<UmbracoPipelineOptions> startupOptions = ApplicationServices.GetRequiredService<IOptions<UmbracoPipelineOptions>>();
RunPrePipeline();
RunPrePipeline(startupOptions.Value);
RegisterDefaultRequiredMiddleware();
if (_customMiddlewareRegistration != null)
{
_customMiddlewareRegistration(this);
}
else
{
RegisterRequiredMiddleware();
}
RunPostPipeline(startupOptions.Value);
RunPostPipeline();
configureUmbracoMiddleware(this);
@@ -67,7 +63,7 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
public void WithEndpoints(Action<IUmbracoEndpointBuilderContext> configureUmbraco)
{
IOptions<UmbracoPipelineOptions> startupOptions = ApplicationServices.GetRequiredService<IOptions<UmbracoPipelineOptions>>();
RunPreEndpointsPipeline(startupOptions.Value);
RunPreEndpointsPipeline();
AppBuilder.UseEndpoints(endpoints =>
{
@@ -82,14 +78,9 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
/// Registers the default required middleware to run Umbraco
/// </summary>
/// <param name="umbracoApplicationBuilderContext"></param>
private void RegisterRequiredMiddleware()
public void RegisterDefaultRequiredMiddleware()
{
AppBuilder.UseUmbracoCore();
AppBuilder.UseUmbracoRequestLogging();
// We need to add this before UseRouting so that the UmbracoContext and other middlewares are executed
// before endpoint routing middleware.
AppBuilder.UseUmbracoRouting();
UseUmbracoCoreMiddleware();
AppBuilder.UseStatusCodePages();
@@ -118,25 +109,35 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
// endpoints are terminating middleware. All of our endpoints are declared in ext of IUmbracoApplicationBuilder
}
private void RunPrePipeline(UmbracoPipelineOptions startupOptions)
public void UseUmbracoCoreMiddleware()
{
foreach (IUmbracoPipelineFilter filter in startupOptions.PipelineFilters)
AppBuilder.UseUmbracoCore();
AppBuilder.UseUmbracoRequestLogging();
// We need to add this before UseRouting so that the UmbracoContext and other middlewares are executed
// before endpoint routing middleware.
AppBuilder.UseUmbracoRouting();
}
public void RunPrePipeline()
{
foreach (IUmbracoPipelineFilter filter in _umbracoPipelineStartupOptions.Value.PipelineFilters)
{
filter.OnPrePipeline(AppBuilder);
}
}
private void RunPostPipeline(UmbracoPipelineOptions startupOptions)
public void RunPostPipeline()
{
foreach (IUmbracoPipelineFilter filter in startupOptions.PipelineFilters)
foreach (IUmbracoPipelineFilter filter in _umbracoPipelineStartupOptions.Value.PipelineFilters)
{
filter.OnPostPipeline(AppBuilder);
}
}
private void RunPreEndpointsPipeline(UmbracoPipelineOptions startupOptions)
private void RunPreEndpointsPipeline()
{
foreach (IUmbracoPipelineFilter filter in startupOptions.PipelineFilters)
foreach (IUmbracoPipelineFilter filter in _umbracoPipelineStartupOptions.Value.PipelineFilters)
{
filter.OnEndpoints(AppBuilder);
}