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

tik*_*noa 18 c# ninject bootstrapper asp.net-web-api owin

我正在从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)
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

但是在我的代码和文档示例中,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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

oli*_*lif 21

将以下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<IProductsRepository>().To<ProductRepository>();
        return kernel;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的启动类中使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*ago 5

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);
}
Run Code Online (Sandbox Code Playgroud)