.NET 4.7.2下ASP.NET Web API中Autofac容器自注册失效问题
问题原因与解决方案
你的代码无效的核心原因是:Autofac的ContainerBuilder在调用Build()方法后就无法再添加新的注册项。你先调用builder.Build()创建了容器,之后再调用builder.RegisterInstance(container)的操作不会被应用到已构建好的容器中,自然无法注入到控制器里。
正确实现方式
方案一:使用容器更新(适合已提前构建容器的场景)
通过创建新的ContainerBuilder注册容器实例,再调用容器的Update()方法将注册项合并到已有的容器中:
ContainerBuilder builder = new ContainerBuilder(); // 先完成其他服务的注册,比如控制器、业务服务等 builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // 构建初始容器 IContainer container = builder.Build(); // 创建新的Builder注册容器自身 var updateBuilder = new ContainerBuilder(); updateBuilder.RegisterInstance(container).As<IContainer>().SingleInstance(); // 更新容器,将新注册项合并进去 updateBuilder.Update(container); // 替换Web API的依赖解析器 GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
方案二:提前注册容器委托(更推荐,无需更新容器)
在构建容器前,通过委托方式注册IContainer,利用Autofac的上下文解析自身,避免后续的容器更新操作:
ContainerBuilder builder = new ContainerBuilder(); // 先完成其他服务的注册 builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // 注册IContainer,通过容器上下文获取自身 builder.Register(c => c.Resolve<IContainer>()).As<IContainer>().SingleInstance(); // 构建容器 IContainer container = builder.Build(); // 替换Web API的依赖解析器 GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
注意事项
- 确保已经将Web API的默认依赖解析器替换为Autofac的
AutofacWebApiDependencyResolver,否则控制器无法从Autofac容器中获取依赖。 - 依赖
IContainer的控制器必须被Autofac正确注册(比如通过RegisterApiControllers方法批量注册),否则容器无法解析控制器实例。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

