旧版Web Forms应用中Task异步场景下Autofac服务解析方案问询
你可以通过两种方式实现任意位置的服务解析,GlobalConfiguration.Configuration.DependencyResolver也完全可以满足需求,具体实现方案如下:
方案1:复用现有静态容器实例(更推荐)
你已经在Global.asax中定义了静态的s_containerProvider,只需要对外暴露根容器属性即可直接调用:
- 首先在
Global.asax.cs中新增公开静态属性:
// 引入命名空间:using Autofac; public static IContainer AppContainer => s_containerProvider.ApplicationContainer;
- 在后台Task中使用时,手动创建独立生命周期作用域:
private void DoSomethingInTask() { // 每个Task单独创建作用域,using包裹自动释放 // 若有注册为InstancePerRequest的服务,需传入请求生命周期Tag using var scope = AppContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag); var requiredService = scope.Resolve<IMyRequiredService>(); // 执行业务逻辑 }
方案2:通过GlobalConfiguration.Configuration.DependencyResolver实现
你已将Autofac设为WebApi的依赖解析器,直接调用即可:
private void DoSomethingInTask() { var resolver = GlobalConfiguration.Configuration.DependencyResolver; // 开启独立作用域 using var scope = resolver.BeginScope(); var requiredService = scope.GetService(typeof(IMyRequiredService)) as IMyRequiredService; // 执行业务逻辑 }
关键注意事项
- 不可在后台Task中复用
RequestLifetime作用域,该作用域绑定HTTP请求生命周期,请求结束后会自动释放,若Task仍在运行会触发对象已释放异常 - 所有后台服务解析必须手动创建独立作用域并通过
using包裹,避免内存泄漏 - 每个Task对应一个独立作用域即可满足多Task作用域隔离的需求,不同作用域内的服务实例互不干扰
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

