Ninject不解析OWIN的依赖关系
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("uri"); } private static IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.bind<Func>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.bind().To(); RegisterServices(kernel); return kernel; } private static void ReigsterServices(IKernel kernel) { kernel.Bind().To() .InRequestScope(); } }
当我尝试访问已解析的IAppSettings时,它始终为null并且发生空引用exception。 可能有什么不对?
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(); webHost.Configuration(builder); } ); } //[...] }
这将在注入了WebAppHost
实例中调用Configuration
方法。
PS:作为一个建议 ,我认为你不应该在RegisterServices
使用InRequestScope()
来进行IAppSettings
绑定。 使用单例,瞬态或自定义范围。 根据我的经验,您不需要任何绑定到请求范围的应用程序设置。