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; } readonly IConfiguration Configuration; readonly IZeroStartupOptions StartupOptions; 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(); // adds and discovers additional and built-in assemblies new AssemblyDiscovery(Mvc).Execute(StartupOptions.AssemblyDiscoveryRules); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); AddModule(); //if (Environment.GetEnvironmentVariable("DOTNET_WATCH") == "1") //{ // Mvc.AddRazorRuntimeCompilation(); //} // configure FluentValidation ValidatorOptions.Global.PropertyNameResolver = ValidatorCamelCasePropertyResolver.ResolvePropertyName; } /// /// Use specified options /// public ZeroBuilder WithOptions(Action configureOptions) { Services.Configure(configureOptions); return this; } public ZeroBuilder AddModule() where T : class, IZeroModule, new() { ZeroModuleCollection.AddModule(Services, Configuration); return this; } /// /// Adds a zero plugin /// public ZeroBuilder AddPlugin() where T : class, IZeroPlugin, new() { ZeroPluginInitializer.AddPlugin(Services, Configuration); return this; } /// /// Adds a zero plugin /// public ZeroBuilder AddPlugin(Func implementationFactory) where T : class, IZeroPlugin, new() { ZeroPluginInitializer.AddPlugin(Services, Configuration, implementationFactory); return this; } }