【问题标题】:How can I inject knex using inversify?如何使用 inversify 注入 knex?
【发布时间】:2016-09-17 07:57:57
【问题描述】:

如何初始化 knex 并使用 Inversify 依赖注入器将其注入

我需要的每个地方?

【问题讨论】:

  • 你可以创建一个类来处理一个 knex 实例,然后在需要时注入它。
  • 我试图按照这篇文章创建了一个初始化 knex 的工厂,但我不知道如何将工厂绑定到它的接口

标签: typescript dependency-injection knex.js inversifyjs


【解决方案1】:

我从未使用过Knex,但我是 InversifyJS 的作者,我会尽力帮助你。

基于Knexdocs,您可以执行以下操作:

var knex = require('knex')({
  client: 'mysql',
  connection: {
    host : '127.0.0.1',
    user : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  }
});

我还发现了 here 类型的 TS。

我假设您要注入的是knex 实例。您可以执行以下操作:

import * as Knex from 'knex';
import { Kernel } from "inversify";

// configuration
let configuration: Knex.Config = {
  client: 'mysql',
  connection: {
    host : '127.0.0.1',
    user : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  }
};

// instance
let knex: Knex = Knex(configuration);

let kernel = new Kernel();
kernel.bind<Knex>("Knex").toConstantValue(knex);

这样 knex 将是一个单例。如果您不希望它成为单例,则需要一个工厂:

 import * as Knex from 'knex';
 import { interfaces, Kernel } from "inversify";

 kernel.bind<interfaces.Factory<Knex>>("Factory<Knex>")
       .toFactory((ctx: interfaces.Context) => {
           return Knex({
               client: 'mysql',
               connection: {
                   host : '127.0.0.1',
                   user : 'your_database_user',
                   password : 'your_database_password',
                   database : 'myapp_test'
               }
           });
       });

你也可以分开配置:

 import * as Knex from 'knex';
 import { interfaces, Kernel } from "inversify";

 kernel.bind<Knex.Config>("KnexConfig").toConstantValue({
     client: 'mysql',
     connection: {
         host : '127.0.0.1',
         user : 'your_database_user',
         password : 'your_database_password',
         database : 'myapp_test'
     }
 });

 kernel.bind<interfaces.Factory<Knex>>("Factory<Knex>")
       .toFactory((ctx: interfaces.Context) => {
           let config = context.kernel.get<Knex.Config>("KnexConfig");
           return Knex(config);
       });

这些解决方案为您提供工厂:

let knexFactory = kernel.get<interfaces.Factory<Knex>>("Factory<Knex>");
let knex = knexFactory();

可以使用@inject("Factory&lt;Knex&gt;") 注解将工厂注入到其他类中。

如果您不想使用单例并且不想使用工厂,那么您将需要动态值注入:

kernel.bind<Knex>("Knex").toDynamicValue((context: interfaces.Context) => {
    return Knex({
        client: 'mysql',
        connection: {
            host : '127.0.0.1',
            user : 'your_database_user',
            password : 'your_database_password',
            database : 'myapp_test'
        }
    });
});

动态值注入将注入一个新的 knex 实例。不是单身也不是工厂:

let knex = kernel.get<Knex>("Knex>");

请注意,我没有测试这些建议。我希望他们能引导你走向正确的方向。

【讨论】:

  • 单例是正确的方法,因为 knex 实例将响应连接池等敏感资源。这个答案确实是一个了不起的指南。
猜你喜欢
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2020-08-14
相关资源
最近更新 更多