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