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

2024-01-14

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

https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application 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,您还需要下载来自存储库的 Ninject Resolver 类 https://github.com/WebApiContrib/WebApiContrib.IoC.Ninject/blob/master/src/WebApiContrib.IoC.Ninject/NinjectResolver.cs以避免兼容性问题。

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

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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WebApi OwinHost 启动中使用 Ninject 引导程序? 的相关文章

随机推荐

  • 如何使用存储过程实现Gridview自定义分页?

    有人可以将我重定向到您自己的博客链接或任何其他链接 解释有关如何使用存储过程实现 gridview 自定义分页的完整教程吗 我在 google 中的搜索给了我 2006 年的旧文章 现在我正在使用 asp net 3 5 和 c aspx
  • Homestead Laravel 继续运行之前的版本

    我已按照以下步骤操作https laravel com docs 8 x homestead updating homestead https laravel com docs 8 x homestead updating homestea
  • 我的应用程序中的 Google 地图不可见

    当我启动我的应用程序时 出现以下错误 V GoogleSignatureVerifier 4962 com myapp application signature not valid Found V GoogleSignatureVerif
  • 创建 Maven 项目,无法解析原型,连接被拒绝

    我怀疑我有 Maven 代理问题 当我创建一个新项目时 1 文件 gt 新建 gt Maven项目 2 我选择原型 在 org apache maven archetypes 中 gt maven 原型 webapp 3 我得到这个错误 无
  • 从其他进程获取模块句柄

    有没有办法使用 C 从另一个进程获取我知道其名称的模块的句柄 GetModuleHandle and GetModuleHandleEx仅从同一进程获取句柄就很好 您可以使用读取进程内存 http msdn microsoft com en
  • 域名可以有两个连续的连字符吗

    我在 SO 上查找了几个问题 这似乎表明不允许使用两个连续的连字符 例如 my website com 但是当我在http www register com index rcmx http www register com index rc
  • Flask-sqlalchemy - PostgreSQL - 为表定义特定模式?

    我想使用flask sqlalchemy 为 模型 定义特定模式 当您在 sqlalchemy 本身中创建表对象时 它有一个用于传递模式名称的参数 我如何在flask sqlalchemy中做到这一点 当您定义模型类时 请使用 table
  • 最佳实践 - 在 EntityFramework 中混合表实体与视图实体?

    我有一个遗留数据库 我想与实体框架进行交互 该数据库经过高度规范化 用于存储有关航班的信息 为了更容易地处理某些数据 编写了许多 SQL 视图来扁平化数据并将某些多表连接转换为更多逻辑信息 快速查看后 我发现在 EF 中使用视图有两个问题
  • Spring Integration 通道统计指标

    不知怎的 我没有捕捉到 Spring Integration Metrics 内容 我想要的是关于每秒有多少消息通过消息通道 最小和最大吞吐量是多少的统计输出 如果我使用newTicketChannel getSendRate 然后我变成以
  • 如何使用 cmis 查询过滤文件夹子级?

    我想通过一个查询从 cmis 1 0 兼容存储库中过滤文件夹的子级 到目前为止 这似乎不可能 所以我决定执行两个查询来检索子项 即文件夹和文档 但是仍然想按自定义类型过滤子项 因此我有以下查询 SELECT cmis objectTypeI
  • R:将多个二元列转换为一个因子变量,其因子是二元列

    我收到了一个可怕的数据集 我正在努力清理它 272 个 字符 变量和 343 个观察值 它由许多二元变量组成 这些二元变量可以概括为具有多个因素的一个变量 因此 不要问 您是个体经营者还是受雇者 并且给定选项 1 自雇 2 受雇 以及可能
  • Mongoose .find() 方法导致请求挂起

    我定义了这条路线 但对其发出的任何请求都会陷入 待处理 状态并永远运行 当我记录代码时 我看到1其次是4 这意味着 find 方法中的代码永远不会被执行 Calendar routes router get calendars req re
  • Hive UDF 用于选择除某些列之外的所有列

    HiveQL 以及一般的 SQL 中常见的查询构建模式是选择所有列 SELECT 或明确指定的一组列 SELECT A B C SQL 没有内置机制来选择除指定的一组列之外的所有列 有多种机制可以排除某些列 如中所述这个问题 https s
  • Visual Studio 2012 - F12 进入 razor renderpartial 停止工作

    我正在使用 Visual Studio 2012 和 Resharper 7 如果我有一个 cshtml 视图 可以在其中渲染部分视图 我可以将标记放在该部分视图的名称上 然后按 F12 这将带我到部分视图的文件 现在它突然停止工作了 而是
  • 关于星形图案

    我正在尝试打印下面的星形图案 我使用以下逻辑来打印 前半部分代码 int i j for i 1 i lt 3 i for j 1 j lt i j System out print for j i 1 j gt 1 j System ou
  • Google App Engine 中的 PHP header() 重定向

    我尝试在 Google App 引擎实例上进行标头重定向 header HTTP 1 1 301 Moved Permanently header Location http location header Connection close
  • MySQL存储过程,处理多个游标和查询结果

    如何在同一个例程中使用两个游标 如果我删除第二个游标声明并获取循环 则一切正常 该例程用于在我的网络应用程序中添加朋友 它获取当前用户的 id 和我们要添加为好友的好友的电子邮件 然后检查该电子邮件是否具有相应的用户 id 如果不存在好友关
  • 使用 python nmap 模块扫描先前扫描生成的主机

    我一直在直接从 python 命令行使用该模块 尝试弄清楚它是如何工作的 并开始拼凑出我想要编写的脚本将如何工作 我想做的是首先进行简单的主机发现扫描 例如 n sP PE 然后使用 all hosts 函数生成实际端口扫描的主机列表 所以
  • 设置“log4j.properties”文件的绝对路径

    我的网络应用程序使用 apache commons log4j 通常 log4j 需要类路径中的配置文件 但我需要将日志记录配置委托给外部文件 我需要在环境中部署 war 但日志配置 最大大小 位置等 取决于第二个团队 我的类路径中有一个
  • 如何在 WebApi OwinHost 启动中使用 Ninject 引导程序?

    我正在从 IIS WebAPI 迁移到 OwinHost 利用 nuget 软件包的最新预发布版本 我成功地使用了此处的说明 https github com ninject Ninject Web Common wiki Setting