如何为自托管MVC 4 API控制器配置依赖注入
问题原因
报错是Web API默认控制器激活器未从依赖解析器中获取到DataController实例,转而尝试调用无参构造函数实例化失败导致的。
解决步骤
1. 注册控制器到依赖注入容器
你当前仅注册了IRepository的实现,没有将DataController加入服务集合,依赖解析器无法返回控制器实例,激活器就会降级走无参构造逻辑。
如果使用Microsoft.Extensions.DependencyInjection,在服务注册阶段添加控制器注册即可:
var services = new ServiceCollection() .AddSingleton<IRepository>(new InMemoryRepository()) // 控制器生命周期可按需求选择Transient/Scoped .AddTransient<DataController>();
如果使用Ninject,同样需要绑定控制器:
kernel.Bind<DataController>().ToSelf();
2. 移除冗余配置
你在代码中两次为httpConfiguration.DependencyResolver赋值,属于冗余操作,删除其中一次即可,避免重复构建服务提供器导致实例不一致。
3. 可选:显式替换控制器激活器
如果修改后仍报错,可以显式替换控制器激活器,强制从依赖解析器获取控制器实例,完全跳过默认的无参构造查找逻辑:
httpConfiguration.Services.Replace(typeof(IHttpControllerActivator), new ServiceProviderControllerActivator(services.BuildServiceProvider()));
额外提示
你代码中注册IRepository时写的ImMemoryRepository拼写多了一个m,应为InMemoryRepository,如果是实际代码的拼写错误也会导致依赖解析失败。
内容的提问来源于stack exchange,提问作者Leon Zhou
相关产品推荐
相关产品推荐

