DynamicApiServiceExtensions.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using Microsoft.AspNetCore.Builder;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.AspNetCore.Mvc.Abstractions;
  7. using Microsoft.AspNetCore.Mvc.ApplicationParts;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using Microsoft.Extensions.Options;
  10. using ZhonTai.DynamicApi.Helpers;
  11. namespace ZhonTai.DynamicApi;
  12. /// <summary>
  13. /// Add Dynamic WebApi
  14. /// </summary>
  15. public static class DynamicApiServiceExtensions
  16. {
  17. /// <summary>
  18. /// Use Dynamic WebApi to Configure
  19. /// </summary>
  20. /// <param name="application"></param>
  21. /// <param name="optionsAction"></param>
  22. /// <returns></returns>
  23. public static IApplicationBuilder UseDynamicApi(this IApplicationBuilder application, Action<IServiceProvider,DynamicApiOptions> optionsAction)
  24. {
  25. var options = new DynamicApiOptions();
  26. optionsAction?.Invoke(application.ApplicationServices,options);
  27. options.Valid();
  28. AppConsts.DefaultAreaName = options.DefaultAreaName;
  29. AppConsts.DefaultHttpVerb = options.DefaultHttpVerb;
  30. AppConsts.DefaultApiPreFix = options.DefaultApiPrefix;
  31. AppConsts.ControllerPostfixes = options.RemoveControllerPostfixes;
  32. AppConsts.ActionPostfixes = options.RemoveActionPostfixes;
  33. AppConsts.FormBodyBindingIgnoredTypes = options.FormBodyBindingIgnoredTypes;
  34. AppConsts.NamingConvention = options.NamingConvention;
  35. AppConsts.GetRestFulControllerName = options.GetRestFulControllerName;
  36. AppConsts.GetRestFulActionName = options.GetRestFulActionName;
  37. AppConsts.AssemblyDynamicApiOptions = options.AssemblyDynamicApiOptions;
  38. var partManager = application.ApplicationServices.GetRequiredService<ApplicationPartManager>();
  39. // Add a custom controller checker
  40. var featureProviders = application.ApplicationServices.GetRequiredService<DynamicApiControllerFeatureProvider>();
  41. partManager.FeatureProviders.Add(featureProviders);
  42. foreach(var assembly in options.AssemblyDynamicApiOptions.Keys)
  43. {
  44. var partFactory = ApplicationPartFactory.GetApplicationPartFactory(assembly);
  45. foreach(var part in partFactory.GetApplicationParts(assembly))
  46. {
  47. partManager.ApplicationParts.Add(part);
  48. }
  49. }
  50. var mvcOptions = application.ApplicationServices.GetRequiredService<IOptions<MvcOptions>>();
  51. var DynamicApiConvention = application.ApplicationServices.GetRequiredService<DynamicApiConvention>();
  52. mvcOptions.Value.Conventions.Add(DynamicApiConvention);
  53. return application;
  54. }
  55. public static IServiceCollection AddDynamicApiCore<TSelectController, TActionRouteFactory>(this IServiceCollection services)
  56. where TSelectController: class,ISelectController
  57. where TActionRouteFactory: class, IActionRouteFactory
  58. {
  59. services.AddSingleton<ISelectController, TSelectController>();
  60. services.AddSingleton<IActionRouteFactory, TActionRouteFactory>();
  61. services.AddSingleton<DynamicApiConvention>();
  62. services.AddSingleton<DynamicApiControllerFeatureProvider>();
  63. return services;
  64. }
  65. /// <summary>
  66. /// Add Dynamic WebApi to Container
  67. /// </summary>
  68. /// <param name="services"></param>
  69. /// <param name="options">configuration</param>
  70. /// <returns></returns>
  71. public static IServiceCollection AddDynamicApi(this IServiceCollection services, DynamicApiOptions options)
  72. {
  73. if (options == null)
  74. {
  75. throw new ArgumentException(nameof(options));
  76. }
  77. options.Valid();
  78. AppConsts.DefaultAreaName = options.DefaultAreaName;
  79. AppConsts.DefaultHttpVerb = options.DefaultHttpVerb;
  80. AppConsts.DefaultApiPreFix = options.DefaultApiPrefix;
  81. AppConsts.ControllerPostfixes = options.RemoveControllerPostfixes;
  82. AppConsts.ActionPostfixes = options.RemoveActionPostfixes;
  83. AppConsts.FormBodyBindingIgnoredTypes = options.FormBodyBindingIgnoredTypes;
  84. AppConsts.NamingConvention = options.NamingConvention;
  85. AppConsts.GetRestFulControllerName = options.GetRestFulControllerName;
  86. AppConsts.GetRestFulActionName = options.GetRestFulActionName;
  87. AppConsts.AssemblyDynamicApiOptions = options.AssemblyDynamicApiOptions;
  88. AppConsts.FormatResult = options.FormatResult;
  89. AppConsts.FormatResultType = options.FormatResultType;
  90. var partManager = services.GetSingletonInstanceOrNull<ApplicationPartManager>();
  91. if (partManager == null)
  92. {
  93. throw new InvalidOperationException("\"AddDynamicApi\" must be after \"AddMvc\".");
  94. }
  95. // Add a custom controller checker
  96. partManager.FeatureProviders.Add(new DynamicApiControllerFeatureProvider(options.SelectController));
  97. services.Configure<MvcOptions>(o =>
  98. {
  99. // Register Controller Routing Information Converter
  100. o.Conventions.Add(new DynamicApiConvention(options.SelectController, options.ActionRouteFactory));
  101. });
  102. return services;
  103. }
  104. public static IServiceCollection AddDynamicApi(this IServiceCollection services)
  105. {
  106. return AddDynamicApi(services, new DynamicApiOptions());
  107. }
  108. public static IServiceCollection AddDynamicApi(this IServiceCollection services, Action<DynamicApiOptions> optionsAction)
  109. {
  110. var DynamicApiOptions = new DynamicApiOptions();
  111. optionsAction?.Invoke(DynamicApiOptions);
  112. return AddDynamicApi(services, DynamicApiOptions);
  113. }
  114. }