Skip to content

Commit

Permalink
New extension architecture with filter pipelines (#15)
Browse files Browse the repository at this point in the history
* added filter infrastructure
   replaced extension services for Hosting and AspNetCore with filters
   closes #13 (Replace extension services with filters)

* filter improvements:
   added generic version of all filters
   closes #4
   Added convention based method for AddSimpleInjector and filters for this method.
   closes #5
   Added filters for UseSimpleInjector

* fixed inconsistent naming of ModulesHostServices in contexts.

* added test for bug #12
* replaced HostFactories with filters
  fixes #12

+semver: minor
  • Loading branch information
fw2568 authored Aug 9, 2020
1 parent bc8dc2f commit a416f90
Show file tree
Hide file tree
Showing 54 changed files with 789 additions and 330 deletions.
16 changes: 16 additions & 0 deletions src/Hosuto.Abstractions/IFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;

namespace Dbosoft.Hosuto
{
public interface IFilter<T1>
{
Action<T1> Invoke(Action<T1> next);
}

public interface IFilter<T1, T2>
{
Action<T1, T2> Invoke(Action<T1, T2> next);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Dbosoft.Hosuto.Modules.Hosting
public interface IModuleBootstrapContext<TModule> where TModule : IModule
{
TModule Module { get; }
IServiceProvider ModuleHostServices { get; }
IServiceProvider ModulesHostServices { get; }

IAdvancedModuleContext Advanced { get; }
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

namespace Dbosoft.Hosuto.Modules.Hosting
{
public interface IModuleConfigurationFilter : IFilter<IModulesHostBuilderContext, IConfigurationBuilder>
{
}

public interface IModuleConfigurationFilter<TModule> : IFilter<IModulesHostBuilderContext<TModule>, IConfigurationBuilder> where TModule : IModule
{
}

}
2 changes: 1 addition & 1 deletion src/Hosuto.Abstractions/Modules/Hosting/IModuleContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface IModuleContext<TModule> : IModuleContext where TModule : IModul
public interface IModuleContext : IDisposable
{
object Module { get; }
IServiceProvider ModuleHostServices { get; }
IServiceProvider ModulesHostServices { get; }

IServiceProvider Services { get; }

Expand Down

This file was deleted.

14 changes: 14 additions & 0 deletions src/Hosuto.Abstractions/Modules/Hosting/IModuleServicesFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Dbosoft.Hosuto.Modules.Hosting
{
public interface IModuleServicesFilter : IFilter<IModulesHostBuilderContext, IServiceCollection>
{
}

public interface IModuleServicesFilter<TModule> : IFilter<IModulesHostBuilderContext<TModule>, IServiceCollection> where TModule : IModule
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,9 @@ public interface IModulesHostBuilderContext
IAdvancedModuleContext Advanced { get; }

}

public interface IModulesHostBuilderContext<TModule> : IModulesHostBuilderContext where TModule : IModule
{
new TModule Module { get; }
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System;
using Microsoft.AspNetCore.Hosting;

namespace Dbosoft.Hosuto.Modules.Hosting
{
internal class DelegateWebModuleWebHostBuilderFilter : IWebModuleWebHostBuilderFilter
{
private readonly Action<WebModule, IWebHostBuilder> _configureDelegate;

public DelegateWebModuleWebHostBuilderFilter(Action<WebModule, IWebHostBuilder> configureDelegate)
{
_configureDelegate = configureDelegate;
}

public Action<WebModule, IWebHostBuilder> Invoke(Action<WebModule, IWebHostBuilder> next)
{
return (webModule, builder) =>
{
_configureDelegate(webModule, builder);
next(webModule, builder);
};
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System;
using Microsoft.AspNetCore.Builder;

namespace Dbosoft.Hosuto.Modules.Hosting
{
public interface IWebModuleConfigureFilter : IFilter<IModuleContext, IApplicationBuilder>
{ }
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Microsoft.AspNetCore.Hosting;

namespace Dbosoft.Hosuto.Modules.Hosting
{
public interface IWebModuleWebHostBuilderFilter : IFilter<WebModule, IWebHostBuilder>
{
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ namespace Dbosoft.Hosuto.Modules.Hosting
{
public interface IWebModuleWebHostBuilderInitializer
{
void ConfigureWebHost(WebModule module, Microsoft.Extensions.Hosting.IHostBuilder builder, IEnumerable<IWebModuleWebHostBuilderConfigurer> configurers);
void ConfigureWebHost(WebModule module, Microsoft.Extensions.Hosting.IHostBuilder builder, IEnumerable<IWebModuleWebHostBuilderFilter> filters);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,25 @@ namespace Dbosoft.Hosuto.Modules.Hosting
public static class ModuleHostingOptionsExtensions
{
#if NETSTANDARD

public static IModuleHostingOptions Configure(this IModuleHostingOptions options, Action<IWebHostBuilder> configure)
{
if (!options.Properties.ContainsKey("ConfigureWebHostAction"))
options.Properties.Add("ConfigureWebHostAction", configure);
return options;
}

internal static IModuleHostingOptions ConfigureWebHostBuilder(this IModuleHostingOptions options, IWebHostBuilder builder)
{
if (!options.Properties.ContainsKey("ConfigureWebHostAction"))
return options;

var configureDelegate = (Action<IWebHostBuilder>)options.Properties["ConfigureWebHostAction"];
configureDelegate?.Invoke(builder);

return options;
}

public static IModuleHostingOptions BuildWebHostCallback(this IModuleHostingOptions options, Func<IWebHostBuilder, IWebHost> buildDelegate)
{
if(!options.Properties.ContainsKey("BuildWebHostAction"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ public static IModulesHostBuilder UseAspNetCore(this IModulesHostBuilder builder
{
builder.ConfigureFrameworkServices((ctx, services) =>
{
services.Decorate<IHostFactory, WebModuleHostFactory>();
services.AddTransient(typeof(IBootstrapHostFilter<>), typeof(WebModuleBootstrapHostFilter<>));
services.TryAddTransient<IWebModuleWebHostBuilderInitializer, WebModuleWebHostBuilderInitializer>();
if(configure!=null)
services.AddTransient<IWebModuleWebHostBuilderConfigurer>(sp=>new DelegateWebHostBuilderConfigurer(configure));
services.AddTransient<IWebModuleWebHostBuilderFilter>(sp=>new DelegateWebModuleWebHostBuilderFilter(configure));
});

Expand All @@ -60,7 +60,7 @@ public static IModulesHostBuilder UseAspNetCore(this IModulesHostBuilder builder

builder.ConfigureFrameworkServices((ctx, services) =>
{
services.Decorate<IHostFactory, WebModuleHostFactory>();
services.AddTransient(typeof(IBootstrapHostFilter<>), typeof(WebModuleBootstrapHostFilter<>));
services.TryAddTransient<IWebModuleWebHostBuilderFactory>(sp => new DelegateWebHostBuilderFactory(webHostBuilder));
});
Expand All @@ -74,7 +74,7 @@ public static IModulesHostBuilder ConfigureAspNetCore(this IModulesHostBuilder b

builder.ConfigureFrameworkServices((ctx, services) =>
{
services.TryAddTransient<IWebModuleWebHostBuilderConfigurer>(sp => new DelegateWebHostBuilderConfigurer(configure));
services.TryAddTransient<IWebModuleWebHostBuilderFilter>(sp => new DelegateWebModuleWebHostBuilderFilter(configure));
});

return builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;

namespace Dbosoft.Hosuto.Modules.Hosting
{
public class WebModuleBootstrapHostFilter<TModule> : IBootstrapHostFilter<TModule> where TModule : IModule
{
public Action<BootstrapModuleHostCommand<TModule>> Invoke(Action<BootstrapModuleHostCommand<TModule>> next)
{
return (command) =>
{
var handler = new WebModuleBootstrapHostHandler<TModule>();
handler.BootstrapHost(command);
next(command);
};
}
}
}
Loading

0 comments on commit a416f90

Please sign in to comment.