2021-11-22 14:29:22 +01:00
using FluentValidation ;
using Microsoft.AspNetCore.Hosting ;
using Microsoft.Extensions.Configuration ;
using Microsoft.Extensions.DependencyInjection ;
namespace zero ;
// TODO maybe use a middleware like Hangfire does: https://github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.AspNetCore/HangfireEndpointRouteBuilderExtensions.cs
public class ZeroBuilder
{
public virtual IServiceCollection Services { get ; }
public virtual IMvcBuilder Mvc { get ; }
2022-01-08 00:24:04 +01:00
internal static ZeroModuleCollection Modules { get ; private set ; } = new ();
2021-12-12 15:41:51 +01:00
2021-11-24 15:49:25 +01:00
readonly IConfiguration Configuration ;
readonly IZeroStartupOptions StartupOptions ;
2021-11-22 14:29:22 +01:00
2022-01-08 00:24:04 +01:00
internal static HashSet < IZeroPlugin > Plugins { get ; private set ; } = new ();
2021-11-22 14:29:22 +01:00
public ZeroBuilder ( IServiceCollection services , IConfiguration configuration , Action < IZeroStartupOptions > setupAction )
{
Services = services ;
Mvc = services . AddMvc ();
Configuration = configuration ;
// create startup options
StartupOptions = new ZeroStartupOptions ( Mvc );
StartupOptions . AssemblyDiscoveryRules . Add ( new ZeroAssemblyDiscoveryRule ());
setupAction ?. Invoke ( StartupOptions );
2021-11-29 00:38:55 +01:00
services . AddControllers ();
2022-01-07 12:47:37 +01:00
services . AddRazorPages ();
2021-11-29 00:38:55 +01:00
2021-11-22 14:29:22 +01:00
// adds and discovers additional and built-in assemblies
new AssemblyDiscovery ( Mvc ). Execute ( StartupOptions . AssemblyDiscoveryRules );
2022-01-06 18:10:58 +01:00
Modules . Add < ZeroApplicationModule >();
Modules . Add < ZeroArchitectureModule >();
Modules . Add < ZeroCommunicationModule >();
Modules . Add < ZeroConfigurationModule >();
Modules . Add < ZeroContextModule >();
Modules . Add < ZeroFileStorageModule >();
Modules . Add < ZeroIdentityModule >();
Modules . Add < ZeroLocalizationModule >();
Modules . Add < ZeroMailModule >();
Modules . Add < ZeroMapperModule >();
Modules . Add < ZeroMediaModule >();
Modules . Add < ZeroPageModule >();
Modules . Add < ZeroPersistenceModule >();
Modules . Add < ZeroRenderingModule >();
Modules . Add < ZeroRoutingModule >();
Modules . Add < ZeroSpaceModule >();
Modules . Add < ZeroStoreModule >();
2021-12-12 15:41:51 +01:00
Modules . ConfigureServices ( services , configuration );
2021-11-22 14:29:22 +01:00
// configure FluentValidation
ValidatorOptions . Global . PropertyNameResolver = ValidatorCamelCasePropertyResolver . ResolvePropertyName ;
}
/// <summary>
/// Use specified options
/// </summary>
public ZeroBuilder WithOptions ( Action < ZeroOptions > configureOptions )
{
Services . Configure ( configureOptions );
return this ;
}
/// <summary>
/// Adds a zero plugin
/// </summary>
public ZeroBuilder AddPlugin < T >() where T : class , IZeroPlugin , new ()
{
2022-01-08 00:24:04 +01:00
T plugin = new T ();
plugin . ConfigureServices ( Services , Configuration );
AssemblyDiscovery . Current . AddAssembly ( typeof ( T ). Assembly );
Services . AddSingleton < IZeroPlugin , T >();
Plugins . Add ( plugin );
2021-11-22 14:29:22 +01:00
return this ;
}
}