using Apimanager_backend.Data; using Public; using System.Reflection; namespace Apimanager_backend.Services { // PluginLoaderService.cs public class PluginLoaderService { private readonly IWebHostEnvironment _env; private readonly ILogger _logger; public PluginLoaderService( IWebHostEnvironment env, ILogger logger) { _env = env; _logger = logger; } public void LoadPlugins(IServiceCollection services) { var pluginsDir = Path.Combine(_env.ContentRootPath, "ApiHandler"); Directory.CreateDirectory(pluginsDir); foreach (var dllPath in Directory.GetFiles(pluginsDir, "*.dll")) { try { var assembly = LoadPluginAssembly(dllPath); RegisterPluginServices(assembly, services); _logger.LogInformation($"已加载插件: {Path.GetFileName(dllPath)}"); } catch (Exception ex) { _logger.LogError(ex, $"加载插件失败: {dllPath}"); } } } private Assembly LoadPluginAssembly(string dllPath) { // 使用隔离的加载上下文 var loadContext = new PluginLoadContext(dllPath); return loadContext.LoadFromAssemblyPath(dllPath); } private void RegisterPluginServices(Assembly assembly, IServiceCollection services) { foreach (var type in assembly.GetTypes()) { if (typeof(IBillableApiHandler).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract) { services.AddTransient(typeof(IBillableApiHandler), type); services.AddTransient(type); // 同时注册具体类型 } } } } }