123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- 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;
- /// <summary>
- /// Add Dynamic WebApi
- /// </summary>
- public static class DynamicApiServiceExtensions
- {
- /// <summary>
- /// Use Dynamic WebApi to Configure
- /// </summary>
- /// <param name="application"></param>
- /// <param name="optionsAction"></param>
- /// <returns></returns>
- public static IApplicationBuilder UseDynamicApi(this IApplicationBuilder application, Action<IServiceProvider,DynamicApiOptions> 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<ApplicationPartManager>();
- // Add a custom controller checker
- var featureProviders = application.ApplicationServices.GetRequiredService<DynamicApiControllerFeatureProvider>();
- 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<IOptions<MvcOptions>>();
- var DynamicApiConvention = application.ApplicationServices.GetRequiredService<DynamicApiConvention>();
- mvcOptions.Value.Conventions.Add(DynamicApiConvention);
- return application;
- }
- public static IServiceCollection AddDynamicApiCore<TSelectController, TActionRouteFactory>(this IServiceCollection services)
- where TSelectController: class,ISelectController
- where TActionRouteFactory: class, IActionRouteFactory
- {
- services.AddSingleton<ISelectController, TSelectController>();
- services.AddSingleton<IActionRouteFactory, TActionRouteFactory>();
- services.AddSingleton<DynamicApiConvention>();
- services.AddSingleton<DynamicApiControllerFeatureProvider>();
- return services;
- }
- /// <summary>
- /// Add Dynamic WebApi to Container
- /// </summary>
- /// <param name="services"></param>
- /// <param name="options">configuration</param>
- /// <returns></returns>
- 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<ApplicationPartManager>();
- 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<MvcOptions>(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<DynamicApiOptions> optionsAction)
- {
- var DynamicApiOptions = new DynamicApiOptions();
- optionsAction?.Invoke(DynamicApiOptions);
- return AddDynamicApi(services, DynamicApiOptions);
- }
- }
|