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

本文关键字:Ninject 引导程序 启动 WebApi OwinHost | 更新日期: 2023-09-27 18:05:20

我正在从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中间件注册的启动注册过程中,我需要NinjectDI。在迁移到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。第二次初始化会产生不良后果。

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

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

将以下nuget包添加到您的应用程序中:

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

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

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

public static class NinjectConfig
{
    public static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        //Create the bindings
        kernel.Bind<IProductsRepository>().To<ProductRepository>();
        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使用同一个,而不是创建另一个。

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

除了Olif的帖子:

  1. 安装包ninject.extensions.conventions

  2. 在您的启动类中添加:using Ninject.Extensions.Conferences;

  3. 代替手动绑定:

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

你现在可以做:

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

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