Asp.Net Core:如何创建新作用域IServiceProvider支持运行时插件
Asp.Net Core运行时插件加载方案探索
目标
创建基于Asp.Net Core的解决方案,支持在IServiceCollection/IServiceProvider锁定后,仍能在运行时加载插件。
核心问题
IServiceCollection在启动阶段完成配置,据此生成IServiceProvider,二者在程序运行前都会被锁定,无法再进行修改。
已尝试的解决方案
- 使用Autofac子容器:创建
ILifetimeScope添加服务,通过自定义IControllerActivator激活控制器,但无法使用AddDbContext等标准扩展方法。 - 克隆原始
IServiceCollection:加载插件时克隆集合并添加新服务,可使用标准扩展,但DbContext无法按请求正确释放。 - 每次请求创建新
IServiceProvider:内存持续增长,资源未正确释放。 - 复用插件
IServiceProvider并创建作用域:在自定义IControllerActivator中创建作用域尝试释放资源,但内存仍未回落。 - 目前无可行方案,寻求内存安全的实现方式。
背景疑问
- 默认
IServiceProvider是否没有父子容器概念? IServiceScopeFactory生成的请求级IServiceProvider是否依赖父容器?- 相关中间件如何处理资源释放?
- 替换中间件是否可行?
内容的提问来源于stack exchange,提问作者Sky
相关产品推荐
相关产品推荐

