You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:13