.NET Core MVC插件架构中调用IModule接口实现方法的方案
解决.NET Core MVC插件架构中调用IModule实现方法的问题
你已经完成了插件架构的核心基础工作——加载程序集、识别IModule实现类,接下来只需要补充实例化模块和调用接口方法的逻辑即可。下面是具体的实现方案:
1. 完善类型筛选逻辑
首先要排除掉抽象类和接口(这些类型无法实例化),优化你的类型筛选代码:
var implementedList = assembly.GetTypes() .Where(x => !x.GetTypeInfo().IsAbstract && !x.GetTypeInfo().IsInterface && x.GetTypeInfo().ImplementedInterfaces.Contains(typeof(IModule))) .ToList();
2. 将模块注册到依赖注入容器
为了支持构造函数注入(如果你的模块类有依赖项),推荐把这些模块类型注册到.NET Core的DI容器中,这样后续可以轻松获取所有模块实例。在LoadModuleAssemblies方法里添加注册逻辑:
if (implementedList.Any()) { services.AddMvc() .AddApplicationPart(assembly) .AddControllersAsServices(); // 注册每个IModule实现类到DI容器 foreach (var moduleType in implementedList) { services.AddTransient(typeof(IModule), moduleType); } }
3. 调用GetProperties方法
你可以在应用启动的合适时机(比如Startup的Configure方法,或者任何支持依赖注入的服务中),注入IEnumerable<IModule>来获取所有模块实例,然后调用GetProperties:
示例:在Startup.Configure中调用
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IEnumerable<IModule> modules) { // 其他中间件配置逻辑... // 遍历所有插件模块,调用GetProperties foreach (var module in modules) { ModuleProperties moduleProps = module.GetProperties(); // 根据业务需求处理属性,比如记录模块信息、注册菜单/路由等 Console.WriteLine($"Loaded plugin: {moduleProps.ModuleName} (v{moduleProps.Version})"); } }
可选:无依赖模块的直接实例化方式
如果你的所有插件模块都是无参数构造函数,也可以在LoadModuleAssemblies里直接创建实例并调用方法(但不支持依赖注入,灵活性较差):
foreach (var moduleType in implementedList) { var moduleInstance = (IModule)Activator.CreateInstance(moduleType); var props = moduleInstance.GetProperties(); // 处理模块属性... }
内容的提问来源于stack exchange,提问作者Cyassin
相关产品推荐
相关产品推荐

