You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:01:27