using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Controllers; using System.Reflection; using Gs.Toolbox; namespace Gs.Toolbox { /// /// 用来识别控制器 /// public class CustomControllerFeatureProvider : IApplicationFeatureProvider { public void PopulateFeature(IEnumerable parts, ControllerFeature feature) { var assembly = Assembly.GetEntryAssembly();//获取包含应用程序入口点的程序集 var assemblies = assembly.GetReferencedAssemblies(); assemblies.Append(assembly.GetName()); var list = assemblies.ToList(); for (var i = 0; i < assemblies.Length; i++) { if (assemblies[i].FullName.Contains("System") || assemblies[i].FullName.Contains("Microsoft") || assemblies[i].FullName.Contains("Swashbuckle")) { list.Remove(assemblies[i]); } }; ////////////////lu加上//////// string SearchPath = Gs.Toolbox.AppSettingsHelper.getValueByKey("ServicesPath"); var searchFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), SearchPath); foreach (var file in Directory.EnumerateFiles(searchFolder, "*.dll", SearchOption.AllDirectories)) { try { var assemblyccccc = Assembly.LoadFrom(file); var exportedTypesccc = assemblyccccc.GetExportedTypes(); //if (exportedTypes.Any(t => t.IsSubclassOf(typeof(ApiController)))) //{ // Console.WriteLine("Started service " + assembly.FullName); // builder.RegisterApiControllers(assembly).InstancePerRequest(); // } list.Add(assemblyccccc.GetName()); } catch (Exception ex) { } } /////////////////////// AddController(feature, list.ToArray()); } private void AddController(ControllerFeature feature, AssemblyName[] assemblies) { if (assemblies.Length == 0) { return; } assemblies.ToList().ForEach(assembly => { if (assembly.FullName.Contains("System") || assembly.FullName.Contains("Microsoft") || assembly.FullName.Contains("Swashbuckle")) { return; } //递归获取controller var assTemp = Assembly.Load(assembly); assTemp.GetTypes().ToList().ForEach(type => { //如果实现了IRomteService则认为是一个控制器 if (!IsController(type)) { return; } feature.Controllers.Add(type.GetTypeInfo()); }); var a = assTemp.GetReferencedAssemblies(); AddController(feature, a); }); } public bool IsController(Type type) { if (!type.IsClass) { return false; } if (type.IsAbstract) { return false; } if (!type.IsPublic) { return false; } if (type.ContainsGenericParameters) { return false; } if (type.IsAssignableTo(typeof(IRomteService))) { return true; } return false; } } }