ASP.NET WebAPI 2中使用NInject解析IUserStore依赖的问题
解决OwinStartup中获取NInject注册的IUserStore依赖问题
嘿,我之前也踩过这个坑!WebAPI里的DependencyResolver.Current和MVC的根本不是一回事——前者属于System.Web.Mvc.DependencyResolver体系,而NInject WebAPI实现的是System.Web.Http.Dependencies.IDependencyResolver,直接用MVC的那个肯定拿不到WebAPI容器里的服务。给你两个靠谱的解决办法:
方法一:把NInject内核存为静态实例,直接调用
NInject通常会自动生成一个NinjectWebCommon.cs类,你可以在里面把创建好的内核保存成静态变量,这样在OwinStartup里就能直接访问:
public static class NinjectWebCommon { // 静态保存内核实例 private static readonly IKernel _kernel; static NinjectWebCommon() { _kernel = CreateKernel(); } // 对外提供获取内核的属性 public static IKernel Kernel => _kernel; private static IKernel CreateKernel() { var kernel = new StandardKernel(); try { kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); // 这里注册你的IUserStore实现 kernel.Bind<IUserStore<ExtendedUser, string>>().To<YourCustomUserStore>(); RegisterServices(kernel); // 把NInject设置为WebAPI的依赖解析器 GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); return kernel; } catch { kernel.Dispose(); throw; } } private static void RegisterServices(IKernel kernel) { // 其他服务注册逻辑 } }
然后在OwinStartup里直接用静态内核获取服务:
public class Startup { public void Configuration(IAppBuilder app) { // 先确保NInject已经初始化(比如在Global.asax的Application_Start里调用过NinjectWebCommon.Start()) var userStore = NinjectWebCommon.Kernel.Get<IUserStore<ExtendedUser, string>>(); // 接下来用userStore配置你的Owin身份验证逻辑 // 比如: // var userManager = new UserManager<ExtendedUser, string>(userStore); // app.UseCookieAuthentication(...); } }
方法二:从WebAPI的DependencyResolver里提取NInject内核
如果你不想用静态变量,也可以通过WebAPI全局配置里的解析器来获取内核:
public class Startup { public void Configuration(IAppBuilder app) { // 获取WebAPI的依赖解析器,转成NinjectDependencyResolver var ninjectResolver = GlobalConfiguration.Configuration.DependencyResolver as NinjectDependencyResolver; if (ninjectResolver == null) { throw new InvalidOperationException("NInject未正确配置为WebAPI的依赖解析器"); } // 从内核获取IUserStore var userStore = ninjectResolver.Kernel.Get<IUserStore<ExtendedUser, string>>(); // 后续身份验证配置... } }
关键注意点
一定要保证NInject的初始化在OwinStartup执行之前完成!通常可以在Global.asax的Application_Start方法里调用NinjectWebCommon.Start(),确保内核已经创建并完成所有依赖注册,不然在OwinStartup里会拿不到服务。
内容的提问来源于stack exchange,提问作者NitinSingh
相关产品推荐
相关产品推荐

