设置Dependency Resolver与扩展Dependency Lifescope的区别及UseAutofacWebApi作用
关于Autofac与OWIN集成中
UseAutofacWebApi的疑问与解答 问题描述
在阅读Autofac与OWIN集成的官方文档时,对示例代码存在以下疑问:
示例中已通过config.DependencyResolver = new AutofacWebApiDependencyResolver(container);将Web API的依赖解析器设置为Autofac,为何仍必须调用app.UseAutofacWebApi(config);?该扩展方法用于“将OWIN管道中的Autofac生命周期作用域扩展至Web API依赖作用域”,但设置依赖解析器已共享生命周期作用域,此调用是否必要?同时请说明UseAutofacWebApi的适用场景。
示例代码如下:
public class Startup { public void Configuration(IAppBuilder app) { var builder = new ContainerBuilder(); // STANDARD WEB API SETUP: // Get your HttpConfiguration. In OWIN, you'll create one // rather than using GlobalConfiguration. var config = new HttpConfiguration(); // Register your Web API controllers. builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // Run other optional steps, like registering filters, // per-controller-type services, etc., then set the dependency resolver // to be Autofac. var container = builder.Build(); config.DependencyResolver = new AutofacWebApiDependencyResolver(container); // OWIN WEB API SETUP: // Register the Autofac middleware FIRST, then the Autofac Web API middleware, // and finally the standard Web API middleware. app.UseAutofacMiddleware(container); app.UseAutofacWebApi(config); app.UseWebApi(config); } }
解答
为什么必须调用UseAutofacWebApi(config)?
- 生命周期作用域对齐:仅设置
config.DependencyResolver时,Web API会创建独立的Autofac作用域,和OWIN管道中UseAutofacMiddleware生成的请求级作用域完全分离。这会导致同一个请求内,OWIN中间件和Web API控制器/过滤器解析的服务实例不共享,破坏请求单例的预期行为。 - 过滤器依赖注入支持:Web API的全局过滤器、动作过滤器等组件,仅靠
DependencyResolver无法确保它们从OWIN请求作用域中正确解析依赖。UseAutofacWebApi会替换Web API的过滤器提供程序,让过滤器纳入统一的生命周期管理。 - 请求上下文关联:该方法会将OWIN的请求作用域绑定到Web API的
HttpRequestMessage上,确保整个请求流程中所有依赖解析操作使用同一个Autofac作用域,避免资源泄漏或状态不一致。
UseAutofacWebApi的适用场景
- OWIN托管Web API:只要在OWIN管道中部署Web API,且需要让Web API与OWIN中间件的依赖注入共享同一请求作用域,就必须调用该方法。
- 过滤器使用依赖注入:如果Web API的过滤器(授权、异常处理等)需要注入Autofac注册的服务,该方法能保证过滤器从正确的作用域解析实例。
- 跨组件服务共享:当需要在OWIN中间件和Web API控制器中使用同一个请求级服务实例时,必须通过该方法对齐两者的作用域。
内容的提问来源于stack exchange,提问作者BigHeadBangBang
相关产品推荐
相关产品推荐

