ASP.NET Core 中的应用程序部件如何动态加载?

来源:这里教程网 时间:2026-02-21 17:27:59 作者:

在 ASP.NET Core 中实现应用程序部件的动态加载,通常指的是在运行时加载程序集(如控制器、Razor 页面、视图或服务),而不需要在编译时静态引用。虽然 ASP.NET Core 本身不直接提供“插件式”架构,但可以通过一些机制来实现动态加载功能。

使用 AssemblyLoadContext 动态加载程序集

你可以通过继承 AssemblyLoadContext 来创建自定义上下文,用于加载外部的程序集(例如从磁盘或网络):

将插件 DLL 放置在应用目录外的指定文件夹中 使用
AssemblyLoadContext.Default.LoadFromAssemblyPath()
或自定义上下文加载
加载后可通过反射查找类型并注册到依赖注入容器

示例代码片段:

var assemblyPath = Path.Combine(pluginFolder, "MyPlugin.dll");
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);

动态注册控制器和服务

加载程序集后,需要让 ASP.NET Core 知道其中包含的控制器:

Program.cs
或启动类中,使用
MvcBuilderPartManager
添加应用模型
调用
builder.Services.AddControllers().PartManager.ApplicationParts.Add(...)
扫描程序集中的控制器类型,并将其添加到应用部件集合

示例:

builder.Services.AddControllers()
    .ConfigureApplicationPartManager(manager =>
    {
        var part = new AssemblyPart(assembly);
        manager.ApplicationParts.Add(part);
    });

动态加载 Razor 视图或页面(可选)

如果插件包含 Razor 视图或 Pages,需配置视图位置扩展器:

实现
IViewLocationExpander
来支持自定义视图路径
使用
RazorViewEngineOptions
添加额外的视图搜索路径
或使用预编译视图(Razor 类库)并确保其被正确引用

热更新与卸载注意事项

.NET 默认的

AssemblyLoadContext
不支持卸载,除非使用 Collectible AssemblyLoadContext

创建可收集的上下文以允许后期卸载插件 设置
isCollectible: true
注意:无法卸载正在使用的程序集,需谨慎管理生命周期

基本上就这些。ASP.NET Core 的动态加载依赖于程序集加载、应用部件管理和依赖注入的配合。虽然比传统插件系统复杂,但在微服务或模块化系统中非常实用。关键是控制好加载路径、类型发现和生命周期管理。

相关推荐