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

C# 如何在WebApi OwinHost启动中使用Ninject引导程序?,c#,asp.net-web-api,ninject,owin,bootstrapper,C#,Asp.net Web Api,Ninject,Owin,Bootstrapper,我正在从IIS WebAPI迁移到OwinHost。利用nuget软件包的最新预发布版本,我成功地使用了以下说明: 这是我的代码存根: public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); app.UseNinjectMiddleware(CreateK

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

这是我的代码存根:

    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软件包添加到应用程序中:

  • 安装软件包Microsoft.AspNet.WebApi.Owin
  • 安装软件包Ninject
  • 如果您使用的是web api版本5.0.0.0,则还需要下载以避免兼容性问题

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

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

    手动创建
    内核
    ,然后使
    useinjectmiddleware
    使用相同的内核,而不是创建另一个

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

    除了Olif的职位外:

  • 安装程序包ninject.extensions.conventions

  • 在启动类中添加:使用Ninject.Extensions.Conventions

  • 代替手动绑定:


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

    我尝试了许多组合,以使我的Owin+WebApi工作。多亏了你,我才解决了这个问题。答案中唯一缺少的包是Ninjec.Web.Common。非常感谢。谢谢你这么好的回答!我已经找了很久了
    config.dependencysolver=new NinjectResolver(new Ninject.Web.Common.Bootstrapper().Kernel)这是唯一对我有效的解决方案!无论我做了什么,尝试使用
    app.usenjectMiddleware
    app.usenjectWebAPI
    都会给我“InvalidOperationException:序列不包含元素”。另外,我没有“从repo下载Ninject解析器类”,而是为
    WebApiContrib.IoC.Ninject
    安装了NuGet软件包,这对我很有效,我只是在statup.cs配置函数的末尾调用了解析器。config.dependencysolver=new ninjecthttpdependencysolver(new Ninject.Web.Common.Bootstrapper().Kernel);NinjectHttpDependencyResolver是我的解析器类,我也一直在努力解决这个问题,发现这个问题非常有帮助:
    public void Configuration(IAppBuilder app)
    {
      var kernel = CreateKernel()
    
      var config = new HttpConfiguration();
      config.MapHttpAttributeRoutes();
    
      // USE kernel here
    
      app.UseNinjectMiddleware(() => kernel);
      app.UseNinjectWebApi(config);
    }
    
     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();
                    });