Files
mixtape/zero.Core/ZeroBuilder.cs
T

89 lines
2.7 KiB
C#
Raw Normal View History

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; }
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
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();
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()
{
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;
}
}