2016-10-26 3 views
0

かなり大きなバニラJavaScriptアプリケーション(より多くの消費者を含むフレームワーク)では、別注注入パターンを使用しています。このパターンでは、各JSモジュールがどのような依存関係を取るかを明示することができます。これは、主に2つの理由から有益です。モジュールのユニットテスト時に依存関係を簡単にスタブすることができ、実行時にモジュール実装を動的に置き換えることができます。JavaScriptの注入パターンをTypeScriptに変換できません

すべてのモジュールをTypeScriptに移行し始めましたが、カスタムタイプを公開するいくつかのモジュールを変換する際に問題が発生しました。問題は、TypeScriptがカスタムタイプを即座にエクスポートしたがっているように見えるが、実際には関数呼び出し(依存関係注入パターン)によってランタイム依存関係を提供した後にタイプをエクスポートしたいということです。

したがって、パターン自体を損なうことなく、次の注入パターンをどのようにタイプスクリプトに変換できますか?

module.exports = function ContextModule(logger) { 
 
    var log = logger.register('context'); 
 

 
    function Context() { 
 
    log('creating type'); 
 
    } 
 

 
    Context.prototype = { 
 
    doSomething: function() { 
 
     log('doing something'); 
 
    } 
 
    } 
 

 
    Context.doSomethingStatic = function() { 
 
    log('doing something static'); 
 
    } 
 

 
    return Context; 
 
};

私たちは、カスタム型を返すと、我々がする必要があるときに、それを新しいことができます。例えば以下のように、我々は、main.js上記高度に不自然モジュールを構成するかもしれない:

  • ロガーモジュールは、コンテキストに注入される:以下

    var loggerModule = require('LoggerModule.js'); 
     
    var contextModule = require('ContextModule.js'); 
     
    
     
    logger = loggerModule(); 
     
    var Context = contextModule(logger); 
     
    
     
    // then we might use the Context type 
     
    var context = new Context(); 
     
    context.doSomething();  // instance method 
     
    Context.doSomethingStatic(); // static method

    注モジュール

  • ロガーモジュールのメソッドは、ContextModule関数で直接、または定義している "クラス"実装で使用されます
  • は、我々は彼らに結合するためにモジュールファイル「に必要」とbrowserifyするCommonJsを使用

答えて

0

そこで問題は、我々はパターン自体

を損なうことなく、活字するには、次の噴射パターンを変えることができる方法です

そのまま使用することができます(JavaScriptは有効なTypeScriptです)。あなたが安全を望むならば、射出フレームワークをTypeScriptのイディオムに変換するプロセスは、それを設計したものを使用するよりも難しくなります。

非常にお勧めします。https://github.com/inversify/InversifyJS

+0

お返事ありがとうございます。はい、私はJavaScriptのままにすることを検討していましたので、間違いなく、インターフェイスを作成するか、他のTypeScriptモジュールに挿入するだけです。私は、この作業をするためにTypeScriptにトリックがあるかどうかをもっと調べようとしていました。 Inversifyについては、これがフレームワークなので、他のライブラリへの依存を避けることができました。それでは、私は図書館をもっと詳しく調べます。ありがとう – David

関連する問題