通过AssemblyLoadContext实现运行时动态加载程序集,结合ApplicationParts注册控制器与服务,并利用IViewLocationExpander支持Razor视图扩展,使用Collectible AssemblyLoadContext管理插件生命周期,实现ASP.NET Core的模块化架构。

在 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 的动态加载依赖于程序集加载、应用部件管理和依赖注入的配合。虽然比传统插件系统复杂,但在微服务或模块化系统中非常实用。关键是控制好加载路径、类型发现和生命周期管理。
以上就是ASP.NET Core 中的应用程序部件如何动态加载?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1440576.html
微信扫一扫
支付宝扫一扫