在 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 的动态加载依赖于程序集加载、应用部件管理和依赖注入的配合。虽然比传统插件系统复杂,但在微服务或模块化系统中非常实用。关键是控制好加载路径、类型发现和生命周期管理。
