如何在WebApi OwinHost启动中使用Ninject引导程序?

我正在从IIS WebAPI迁移到OwinHost。 利用nuget软件包的最新预发布版本,我在这里成功使用了说明:

https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application

这是我的代码的存根:

public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); app.UseNinjectMiddleware(CreateKernel); app.UseNinjectWebApi(config); } private static StandardKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Load(Assembly.GetExecutingAssembly()); RegisterServices(kernel); return kernel; } private static void RegisterServices(IKernel kernel) { ... } 

但是在我的代码和文档示例中,Ninject内核直到启动后才会创建。 但是,我需要在Cors和OAuth中间件注册的启动注册过程中使用Ninject DI。 在迁移到OwinHost之前,我可以这样做:

 public void Configuration(IAppBuilder app) { _bootstrapper = new Bootstrapper(); _bootstrapper.Initialize(CreateKernel); var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); // USE _boostrapper.Kernel here app.UseNinjectMiddleware(CreateKernel); app.UseNinjectWebApi(config); } 

但在内部,OwinBootstrapper.Execute将最终调用CreateKernel和bootstrapper.Initialize第二次,结果不好。

在Startup中创建和使用ninject内核并仍然注册Ninject / WebAPI中间件的正确方法是什么?

将以下nuget-packages添加到您的应用程序:

  1. 安装包Microsoft.AspNet.WebApi.Owin
  2. 安装包Ninject

如果您使用的是web api 5.0.0.0版,则还需要从repo下载Ninject Resolver类以避免兼容性问题。

创建一个返回Kernel对象的静态方法

 public static class NinjectConfig { public static IKernel CreateKernel() { var kernel = new StandardKernel(); //Create the bindings kernel.Bind().To(); return kernel; } } 

然后你可以在你的启动类中使用ninject

 public class Startup { public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); config.DependencyResolver = new NinjectResolver(NinjectConfig.CreateKernel()); config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id=RouteParameter.Optional }); app.UseWebApi(config); } } 

手动创建kernel ,然后使UseNinjectMiddleware使用相同的kernel ,而不是创建另一个。

 public void Configuration(IAppBuilder app) { var kernel = CreateKernel() var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); // USE kernel here app.UseNinjectMiddleware(() => kernel); app.UseNinjectWebApi(config); } 

除了Olif的post:

  1. install-package ninject.extensions.conventions

  2. 在你的启动类中添加:using Ninject.Extensions.Conventions;

  3. 而不是手动绑定:

  public static IKernel CreateKernel() { var kernel = new StandardKernel(); //Create the bindings kernel.Bind().To ProductRepository (); return kernel; } 

你现在可以这样做:

 kernel.Bind(x => { x.FromThisAssembly() .SelectAllClasses() .BindDefaultInterface(); }); 

这将查看您的程序集,并自动执行绑定。