Ninject不解析OWIN的依赖关系

本文关键字:依赖 关系 OWIN Ninject | 更新日期: 2023-09-27 17:50:24

public class WebAppHost {
    public WebAppHost(IAppSettings appSettings) {
        this._appSettings = appSettings;
    }
    public Configuration(IAppBuilder appBuilder) {
        if(this._appSettings.StartApi)
            appBuilder.UseWebApi();
    }
}
public class AppContext {
    public static void Start(string[] args) {
        DynamicModule.Utility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModule.Utility.RegisterModule(typeof(NinjectHttpModule));
        _bootstrapper.Initialize(CreateKernel);
        WebApp.Start<WebAppHost>("uri");
    }
    private static IKernel CreateKernel() {
        var kernel = new StandardKernel();
        kernel.bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
        RegisterServices(kernel);
        return kernel;
    }
    private static void ReigsterServices(IKernel kernel) {
        kernel.Bind<IAppSettings>().To<AppSettings>()
            .InRequestScope();
    }
} 

当我尝试访问解析的IAppSettings时,它总是为空,并且发生空引用异常。会出什么问题呢?

Ninject不解析OWIN的依赖关系

OWIN启动将在不使用容器的情况下为您创建WebAppHost实例。为了使用已注入的类执行启动,请使用以下代码:

public class AppContext {
    //[...]
    public static void Start(string[] args) {
        //[...]
        _bootstrapper.Initialize(CreateKernel);
        //Remember to dispose this or put around "using" construct.
        WebApp.Start("uri", builder =>
        {
            var webHost = _bootstrapper.Kernel.Get<WebAppHost>();
            webHost.Configuration(builder);
        } );
    }
    //[...]
}

这将在注入IAppSettingsWebAppHost实例中调用Configuration方法。

PS:作为建议,我认为你不应该在RegisterServices中为IAppSettings绑定使用InRequestScope()。使用单例、瞬态或自定义作用域。根据我的经验,您不需要任何绑定到请求范围的应用程序设置。