using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Collections.Concurrent; namespace zero.Architecture; public class ZeroModuleCollection : ZeroModule { ConcurrentDictionary _modules = new(); /// /// Adds a zero module /// public void Add() where T : class, IZeroModule, new() { Add(new T()); } /// /// Adds a zero module /// public void Add(T moduleInstance) where T : IZeroModule { Add(typeof(T), moduleInstance); } /// /// Adds a zero module /// public void Add(Type moduleType, IZeroModule moduleInstance) { if (_modules.ContainsKey(moduleType)) { return; } _modules.TryAdd(moduleType, moduleInstance); } /// public override void ConfigureServices(IServiceCollection services, IConfiguration configuration) { foreach (var module in _modules.OrderBy(x => x.Value.Order)) { module.Value.ConfigureServices(services, configuration); } } /// public override void Configure(IApplicationBuilder app, IEndpointRouteBuilder routes, IServiceProvider serviceProvider) { foreach (var module in _modules.OrderBy(x => x.Value.ConfigureOrder)) { module.Value.Configure(app, routes, serviceProvider); } } }