2016-09-17 5 views
1

knexを初期化し、Inversify依存インジェクタを使用して注入するにはどうすればいいですか?inversifyを使用してknexを挿入するにはどうすればよいですか?

私は必要な場所ごとに?

+0

クラスを作成して1つのknexインスタンスを処理し、必要なときにいつでも注入することができます。 – Sombriks

+0

私はknexを初期化するためのファクトリを作成したこの記事に従っていましたが、逆に、ファクトリをインターフェイスにバインドする方法がわかりません – user4092086

答えて

3

私は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はシングルトンになります。

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

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

これらのソリューションは、工場をご提供します。あなたはまた、設定を分けることができ

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

:あなたはそれをシングルトンにしたくない場合は、工場が必要になります

工場は、@inject("Factory<Knex>")注釈を使用して他のクラスに注入することができます。

あなたはシングルトンを使用しないと、あなたは動的な値の注入が必要になりますファクトリを使用したくない場合は、次の

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

私はこれらの提案をテストしていないことに注意してください。彼らがあなたを正しい方向に導くことを願っています。

+1

knexインスタンスは接続のような合理的なリソースプール。この答えは確かに素晴らしいガイドです。 – Sombriks

+1

シングルトンのソリューションは魅力的に働いた ありがとう! – user4092086

+0

それはあなたのために働いて問題ない幸せ:) –

関連する問題