using HopFrame.Web.Admin.Attributes; using HopFrame.Web.Admin.Generators.Implementation; using HopFrame.Web.Admin.Providers; using HopFrame.Web.Admin.Providers.Implementation; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace HopFrame.Web.Admin; public static class ServiceCollectionExtensions { public static IServiceCollection AddAdminContext(this IServiceCollection services) where TContext : AdminPagesContext { services.TryAddSingleton(); services.AddSingleton(provider => { var generator = new AdminContextGenerator(); var context = generator.CompileContext(provider); return context; }); PreregisterPages(); return services; } private static void PreregisterPages() where TContext : AdminPagesContext { var contextType = typeof(TContext); var props = contextType.GetProperties(); foreach (var property in props) { var url = property.Name; if (property.GetCustomAttributes(false).Any(a => a is AdminPageUrlAttribute)) { var attribute = property.GetCustomAttributes(false) .Single(a => a is AdminPageUrlAttribute) as AdminPageUrlAttribute; url = attribute?.Url; } AdminPagesProvider.RegisterAdminPage(url, property.PropertyType); } } }