using System; using System.Collections.Generic; using System.Reflection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using ZhonTai.DynamicApi.Helpers; namespace ZhonTai.DynamicApi; /// /// Add Dynamic WebApi /// public static class DynamicApiServiceExtensions { /// /// Use Dynamic WebApi to Configure /// /// /// /// public static IApplicationBuilder UseDynamicApi(this IApplicationBuilder application, Action optionsAction) { var options = new DynamicApiOptions(); optionsAction?.Invoke(application.ApplicationServices,options); options.Valid(); AppConsts.DefaultAreaName = options.DefaultAreaName; AppConsts.DefaultHttpVerb = options.DefaultHttpVerb; AppConsts.DefaultApiPreFix = options.DefaultApiPrefix; AppConsts.ControllerPostfixes = options.RemoveControllerPostfixes; AppConsts.ActionPostfixes = options.RemoveActionPostfixes; AppConsts.FormBodyBindingIgnoredTypes = options.FormBodyBindingIgnoredTypes; AppConsts.NamingConvention = options.NamingConvention; AppConsts.GetRestFulControllerName = options.GetRestFulControllerName; AppConsts.GetRestFulActionName = options.GetRestFulActionName; AppConsts.AssemblyDynamicApiOptions = options.AssemblyDynamicApiOptions; var partManager = application.ApplicationServices.GetRequiredService(); // Add a custom controller checker var featureProviders = application.ApplicationServices.GetRequiredService(); partManager.FeatureProviders.Add(featureProviders); foreach(var assembly in options.AssemblyDynamicApiOptions.Keys) { var partFactory = ApplicationPartFactory.GetApplicationPartFactory(assembly); foreach(var part in partFactory.GetApplicationParts(assembly)) { partManager.ApplicationParts.Add(part); } } var mvcOptions = application.ApplicationServices.GetRequiredService>(); var DynamicApiConvention = application.ApplicationServices.GetRequiredService(); mvcOptions.Value.Conventions.Add(DynamicApiConvention); return application; } public static IServiceCollection AddDynamicApiCore(this IServiceCollection services) where TSelectController: class,ISelectController where TActionRouteFactory: class, IActionRouteFactory { services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); return services; } /// /// Add Dynamic WebApi to Container /// /// /// configuration /// public static IServiceCollection AddDynamicApi(this IServiceCollection services, DynamicApiOptions options) { if (options == null) { throw new ArgumentException(nameof(options)); } options.Valid(); AppConsts.DefaultAreaName = options.DefaultAreaName; AppConsts.DefaultHttpVerb = options.DefaultHttpVerb; AppConsts.DefaultApiPreFix = options.DefaultApiPrefix; AppConsts.ControllerPostfixes = options.RemoveControllerPostfixes; AppConsts.ActionPostfixes = options.RemoveActionPostfixes; AppConsts.FormBodyBindingIgnoredTypes = options.FormBodyBindingIgnoredTypes; AppConsts.NamingConvention = options.NamingConvention; AppConsts.GetRestFulControllerName = options.GetRestFulControllerName; AppConsts.GetRestFulActionName = options.GetRestFulActionName; AppConsts.AssemblyDynamicApiOptions = options.AssemblyDynamicApiOptions; AppConsts.FormatResult = options.FormatResult; AppConsts.FormatResultType = options.FormatResultType; var partManager = services.GetSingletonInstanceOrNull(); if (partManager == null) { throw new InvalidOperationException("\"AddDynamicApi\" must be after \"AddMvc\"."); } // Add a custom controller checker partManager.FeatureProviders.Add(new DynamicApiControllerFeatureProvider(options.SelectController)); services.Configure(o => { // Register Controller Routing Information Converter o.Conventions.Add(new DynamicApiConvention(options.SelectController, options.ActionRouteFactory)); }); return services; } public static IServiceCollection AddDynamicApi(this IServiceCollection services) { return AddDynamicApi(services, new DynamicApiOptions()); } public static IServiceCollection AddDynamicApi(this IServiceCollection services, Action optionsAction) { var DynamicApiOptions = new DynamicApiOptions(); optionsAction?.Invoke(DynamicApiOptions); return AddDynamicApi(services, DynamicApiOptions); } }