using System.Reflection; using Gs.Toolbox.ApiCore.Abstract.Mvc; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Controllers; namespace Gs.Toolbox.ApiCore.Common.Mvc; /// /// 用来识别控制器 /// public class CustomControllerFeatureProvider : IApplicationFeatureProvider< ControllerFeature> { 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加上//////// var SearchPath = AppSettingsHelper.getValueByKey("ServicesPath"); var AssemblyPth = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); var searchFolder = Path.Combine(AssemblyPth, SearchPath); // LogHelper.Debug(ToString(), "searchFolder:" + searchFolder); if (!Directory.Exists(searchFolder)) //如果日志目录不存在就创建 Directory.CreateDirectory(searchFolder); 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("Kerberos") || 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; } }