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(); readonly IConfiguration Configuration; readonly IZeroStartupOptions StartupOptions; internal static HashSet Plugins { get; private set; } = new(); public ZeroBuilder(IServiceCollection services, IConfiguration configuration, Action setupAction) { Services = services; Mvc = services.AddMvc(); Configuration = configuration; // create startup options StartupOptions = new ZeroStartupOptions(Mvc); StartupOptions.AssemblyDiscoveryRules.Add(new ZeroAssemblyDiscoveryRule()); setupAction?.Invoke(StartupOptions); services.AddControllers(); services.AddRazorPages(); // adds and discovers additional and built-in assemblies new AssemblyDiscovery(Mvc).Execute(StartupOptions.AssemblyDiscoveryRules); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.Add(); Modules.ConfigureServices(services, configuration); // configure FluentValidation ValidatorOptions.Global.PropertyNameResolver = ValidatorCamelCasePropertyResolver.ResolvePropertyName; } /// /// Use specified options /// public ZeroBuilder WithOptions(Action configureOptions) { Services.Configure(configureOptions); return this; } /// /// Adds a zero plugin /// public ZeroBuilder AddPlugin() where T : class, IZeroPlugin, new() { T plugin = new T(); plugin.ConfigureServices(Services, Configuration); AssemblyDiscovery.Current.AddAssembly(typeof(T).Assembly); Services.AddSingleton(); Plugins.Add(plugin); return this; } }