ASP.NET WebAPI中Autofac依赖注入配置问题:无法解析构造参数
解决ASP.NET WebAPI中Autofac无法注入服务的问题
我一眼就揪出问题所在了——你在构建容器之后才注册服务,这直接导致Autofac完全不知道你要把Config映射到IConfig!
看你的Application_Start方法:你先调用了var container = builder.Build();,然后才去调用BuildServices(builder)注册IConfig的实现。但Autofac的ContainerBuilder一旦调用Build(),就会冻结所有注册信息,后续的注册操作根本不会被加入到已经构建好的容器里。这就是控制器构造函数无法解析IConfig参数的核心原因。
修正后的Global.asax代码
把BuildServices(builder)的调用移到builder.Build()之前,确保所有服务注册都在容器构建完成前完成:
public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { var builder = new ContainerBuilder(); var config = GlobalConfiguration.Configuration; WebApiConfig.Register(config); // 先完成所有服务注册(包括控制器和自定义服务) builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); BuildServices(builder); // 关键:移到Build容器之前 // 再构建容器并关联到WebAPI var container = builder.Build(); config.DependencyResolver = new AutofacWebApiDependencyResolver(container); config.EnsureInitialized(); log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config"))); } private void BuildServices(ContainerBuilder builder) { builder.RegisterType<Config>().As<IConfig>().InstancePerRequest(); } }
补充确认点
另外请确保你的HeartBeatController确实有一个接收IConfig参数的构造函数,比如:
public class HeartBeatController : ApiController { private readonly IConfig _config; public HeartBeatController(IConfig config) { _config = config; } // 控制器业务方法... }
这样调整后,Autofac就能正确识别IConfig的注册信息,并顺利注入到控制器中了。
内容的提问来源于stack exchange,提问作者Nick__Dudas
相关产品推荐
相关产品推荐

