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;
|
|
/// <summary>
|
/// 用来识别控制器
|
/// </summary>
|
public class
|
CustomControllerFeatureProvider : IApplicationFeatureProvider<
|
ControllerFeature>
|
{
|
public void PopulateFeature(IEnumerable<ApplicationPart> 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;
|
}
|
}
|