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;
}
}
}