InversifyJS を使用して関数を挿入する最良の方法

ダンジガー

InversifyJSを使用して関数を挿入する公式レシピがあります。基本的に、次を使用してすべての依存関係が解決された、指定された関数のカリー化されたバージョンを返すヘルパー関数を定義しますfunccontainer.get(...)

import { container } from "./inversify.config"

function bindDependencies(func, dependencies) {
    let injections = dependencies.map((dependency) => {
        return container.get(dependency);
    });

    return func.bind(func, ...injections);
}

export { bindDependencies };

そして、次のように使用します。

import { bindDependencies } from "./utils/bindDependencies";
import { TYPES } from "./constants/types";

function testFunc(something, somethingElse) {
    console.log(`Injected! ${something}`);
    console.log(`Injected! ${somethingElse}`);
}

testFunc = bindDependencies(testFunc, [TYPES.something, TYPES.somethingElse]);

export { testFunc };

bindDependencies関数のパラメーター名に基づいて、関数の依存関係を明示的に提供せずに、関数を自動的に挿入したいと思います。このようなもの:

import { default as express, Router } from 'express';

import { bindDependencies } from '../injector/injector.utils';

import { AuthenticationMiddleware } from './authentication/authentication.middleware';
import { UsersMiddleware } from './users/users.middleware';

import { ENDPOINTS } from '../../../../common/endpoints/endpoints.constants';


function getRouter(
    authenticationMiddleware: AuthenticationMiddleware,
    usersMiddleware: UsersMiddleware,
): express.Router {
    const router: express.Router = Router();

    const requireAnonymity: express.Handler = authenticationMiddleware.requireAnonymity.bind(authenticationMiddleware);
    const requireAuthentication: express.Handler = authenticationMiddleware.requireAuthentication.bind(authenticationMiddleware);

    router.route(ENDPOINTS.AUTHENTICATION)
        .put(requireAnonymity, authenticationMiddleware.login.bind(authenticationMiddleware))
        .delete(requireAuthentication, authenticationMiddleware.logout.bind(authenticationMiddleware));

    router.route(ENDPOINTS.USER)
        .put(requireAnonymity, usersMiddleware.register.bind(usersMiddleware))
        .post(requireAuthentication, usersMiddleware.update.bind(usersMiddleware))
        .delete(requireAuthentication, usersMiddleware.remove.bind(usersMiddleware));

    return router;
}

const router: express.Router = invoke(getRouter);

export { router as Router };

この場合、注入された関数を 1 回呼び出してその戻り値を取得したいだけであることに注意してください。これはエクスポートしているものです。そのため、コードを関数にラップせずにこれを行うより良い方法があるかもしれませんが、container.get(...)外部で直接使用していますこのモジュールの依存関係が明確ではなく、そのすべての行に広がる可能性があるため、私の構成ルートのルートは良い考えではありませんでした。また、その関数をエクスポートすると、テストが簡素化されます。

私の問題に戻ると、私のinvoke関数は次のようになります。

function invoke<T>(fn: Function): T {
    const paramNames: string[] = getParamNames(fn);

    return fn.apply(null, paramNames.map((paramName: string)
        => container.get( (<any>container).map[paramName.toUpperCase()] ))) as T;
}

以下のためにgetParamNames私が使用ソリューションの一つがここで提案:JavaScriptから動的に関数のパラメータの名前/値を取得する方法

(<any>container).mapinversify.config.tsコンテナを作成したに作成したオブジェクトで、タイプに関係なく、すべての依存関係のキーと実際のキーの文字列表現をリンクします (この場合、単にsymbolまたはFunction):

const container: Container = new Container();

container.bind<FooClass>(FooClass).toSelf();

...

const map: ObjectOf<any> = {};

(<any>container)._bindingDictionary._map
    .forEach((value: any, key: Function | symbol) => {
        map[(typeof key === 'symbol'
            ? Symbol.keyFor(key) : key.name).toUpperCase()] = key;
    });

(<any>container).map = map;

これを行うためのより良い方法があるかどうか、またはそれをしない重要な理由があるかどうかを知っている人はいますか?

レモ・H・ジャンセン

関数の引数名の使用に関する主な問題は、コードを圧縮する際の潜在的な問題です。

function test(foo, bar) {
    console.log(foo, bar);
}

になる:

function test(a,b){console.log(a,b)}

Node.js アプリで作業しているため、おそらく圧縮を使用していないため、これは問題にはなりません

あなたの解決策は良い一時的な解決策だと思います。TypeScript Roapmapを確認すると、「Future」セクションで次のことがわかります。

  • 関数式・矢印関数のデコレータ

これは、将来的に InversifyJS で次のことができるようになることを意味します。

注: とclasses であるAuthenticationMiddleware仮定しますUsersMiddleware

@injectable()
function getRouter(
    authenticationMiddleware: AuthenticationMiddleware,
    usersMiddleware: UsersMiddleware,
): express.Router {
    const router: express.Router = Router();

    const requireAnonymity: express.Handler = authenticationMiddleware.requireAnonymity.bind(authenticationMiddleware);
    const requireAuthentication: express.Handler = authenticationMiddleware.requireAuthentication.bind(authenticationMiddleware);

    router.route(ENDPOINTS.AUTHENTICATION)
        .put(requireAnonymity, authenticationMiddleware.login.bind(authenticationMiddleware))
        .delete(requireAuthentication, authenticationMiddleware.logout.bind(authenticationMiddleware));

    router.route(ENDPOINTS.USER)
        .put(requireAnonymity, usersMiddleware.register.bind(usersMiddleware))
        .post(requireAuthentication, usersMiddleware.update.bind(usersMiddleware))
        .delete(requireAuthentication, usersMiddleware.remove.bind(usersMiddleware));

    return router;
}

または次のとおりです。

注: とインターフェースであるAuthenticationMiddleware仮定しますUsersMiddleware

@injectable()
function getRouter(
    @inject("AuthenticationMiddleware") authenticationMiddleware: AuthenticationMiddleware,
    @inject("UsersMiddleware") usersMiddleware: UsersMiddleware,
): express.Router {
    const router: express.Router = Router();

    const requireAnonymity: express.Handler = authenticationMiddleware.requireAnonymity.bind(authenticationMiddleware);
    const requireAuthentication: express.Handler = authenticationMiddleware.requireAuthentication.bind(authenticationMiddleware);

    router.route(ENDPOINTS.AUTHENTICATION)
        .put(requireAnonymity, authenticationMiddleware.login.bind(authenticationMiddleware))
        .delete(requireAuthentication, authenticationMiddleware.logout.bind(authenticationMiddleware));

    router.route(ENDPOINTS.USER)
        .put(requireAnonymity, usersMiddleware.register.bind(usersMiddleware))
        .post(requireAuthentication, usersMiddleware.update.bind(usersMiddleware))
        .delete(requireAuthentication, usersMiddleware.remove.bind(usersMiddleware));

    return router;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

InversifyJS-オブジェクトの特定のインスタンスを挿入します

分類Dev

InversifyJSのパラメーターを持つファクトリ

分類Dev

inversifyJS構成ファイルを複数のファイルに分割する

分類Dev

Inject HttpContext into InversifyJS middleware

分類Dev

InversifyJS:コンテナからオブジェクトを取得するときにエラーが発生しました

分類Dev

c#を使用してmysqlに複数の行を挿入する最良の方法は?

分類Dev

Python Pandasを使用して列を削除し、列名を挿入するための最良の方法は何ですか?

分類Dev

asyncpgで複数の行を挿入する最良の方法

分類Dev

PostgreSQLの関数を使用して複数の行を挿入する方法

分類Dev

match..withを使用して、条件付きでシーケンス式に値を挿入する最良の方法は?

分類Dev

前/次ボタンを使用してテーブルに整数を挿入する最良の方法

分類Dev

ColdFusionとSQLを使用してテキストファイルを挿入する最良の方法は?

分類Dev

Azure関数を使用してNLogを挿入する方法

分類Dev

vbaを使用してgetdate関数を挿入する方法

分類Dev

トリガーを使用して条件付きで挿入するための最良の方法

分類Dev

複数の関数を使用してPythonクラスでユーザー入力を整理するための最良の方法

分類Dev

JavaScriptでFirebase関数を使用して既存のFirebaseDB配列に挿入する方法

分類Dev

VBAユーザーフォーム-地域の設定に関係なく、TextBoxを10進数の数値入力として使用する最良の方法は?

分類Dev

異なる入力を使用してPowershellで同じ関数を複数回呼び出すための最良の方法は何ですか

分類Dev

jQueryを使用して複数のHTML要素を挿入する方法

分類Dev

PQputCopyDataを使用して複数の行を挿入する方法

分類Dev

PowerShell を使用して Excel の数式を挿入する方法

分類Dev

配列をクリーンアップして新しい要素を挿入するための最良の方法

分類Dev

useReducer関数フックを使用して状態を更新する最良の方法は何ですか?

分類Dev

Javaからsqliteを使用して最後に挿入されたIDを取得する最良の方法は何ですか?

分類Dev

外部関数でsync.WaitGroupを使用する最良の方法

分類Dev

VBAを使用してExcelで範囲の最後に行を挿入する方法

分類Dev

R - 関数の引数として列名を使用し、モデル式に挿入する方法

分類Dev

関数を使用して、別の関数の内部で変数を変更するための最良の方法は何ですか?

Related 関連記事

  1. 1

    InversifyJS-オブジェクトの特定のインスタンスを挿入します

  2. 2

    InversifyJSのパラメーターを持つファクトリ

  3. 3

    inversifyJS構成ファイルを複数のファイルに分割する

  4. 4

    Inject HttpContext into InversifyJS middleware

  5. 5

    InversifyJS:コンテナからオブジェクトを取得するときにエラーが発生しました

  6. 6

    c#を使用してmysqlに複数の行を挿入する最良の方法は?

  7. 7

    Python Pandasを使用して列を削除し、列名を挿入するための最良の方法は何ですか?

  8. 8

    asyncpgで複数の行を挿入する最良の方法

  9. 9

    PostgreSQLの関数を使用して複数の行を挿入する方法

  10. 10

    match..withを使用して、条件付きでシーケンス式に値を挿入する最良の方法は?

  11. 11

    前/次ボタンを使用してテーブルに整数を挿入する最良の方法

  12. 12

    ColdFusionとSQLを使用してテキストファイルを挿入する最良の方法は?

  13. 13

    Azure関数を使用してNLogを挿入する方法

  14. 14

    vbaを使用してgetdate関数を挿入する方法

  15. 15

    トリガーを使用して条件付きで挿入するための最良の方法

  16. 16

    複数の関数を使用してPythonクラスでユーザー入力を整理するための最良の方法

  17. 17

    JavaScriptでFirebase関数を使用して既存のFirebaseDB配列に挿入する方法

  18. 18

    VBAユーザーフォーム-地域の設定に関係なく、TextBoxを10進数の数値入力として使用する最良の方法は?

  19. 19

    異なる入力を使用してPowershellで同じ関数を複数回呼び出すための最良の方法は何ですか

  20. 20

    jQueryを使用して複数のHTML要素を挿入する方法

  21. 21

    PQputCopyDataを使用して複数の行を挿入する方法

  22. 22

    PowerShell を使用して Excel の数式を挿入する方法

  23. 23

    配列をクリーンアップして新しい要素を挿入するための最良の方法

  24. 24

    useReducer関数フックを使用して状態を更新する最良の方法は何ですか?

  25. 25

    Javaからsqliteを使用して最後に挿入されたIDを取得する最良の方法は何ですか?

  26. 26

    外部関数でsync.WaitGroupを使用する最良の方法

  27. 27

    VBAを使用してExcelで範囲の最後に行を挿入する方法

  28. 28

    R - 関数の引数として列名を使用し、モデル式に挿入する方法

  29. 29

    関数を使用して、別の関数の内部で変数を変更するための最良の方法は何ですか?

ホットタグ

アーカイブ