c# - 如何在 WebApi OwinHost Startup 中使用 Ninject bootstrapper?

标签 c# asp.net-web-api ninject owin bootstrapper

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

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

这是我的代码 stub :

    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,您还需要下载 Ninject Resolver class from the repo以避免兼容性问题。

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

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);
    }
}

关于c# - 如何在 WebApi OwinHost Startup 中使用 Ninject bootstrapper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896806/

相关文章:

c# - 底层连接已关闭 : - WebClient error

asp.net - 如何使用 OWIN OAuthBearerAuthentication 验证访问 token ?

dependency-injection - 忍者2.0 : Property Injection without attribute

c# - 使用 Ninject 和 Web API 2.1 注入(inject) API Controller 时出现 InvalidOperationException

c# - 将两个不同类型的列表匹配在一起

c# - 创建带有行索引的表 mysql

jquery - 仅在服务器上发生500个错误之谜

c# - 使用 HttpClient 异步方法返回格式错误的字符串

c# - Unity 中 RegisterInstance 的后期绑定(bind)版本

c# - 我怎样才能在 C# 的异常中获取错误号而不是错误消息?