無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

グローバルインターセプター

JavaScriptで動くDIコンテナの解説その3。

グローバルインターセプターはすべてのコンポーネントに適用されるインターセプターです。複数のコンポーネントに一括してインターセプタを適用したい場合に使います。

  • binder.bindInterceptor()でコンテナに登録します。引数で以下を指定します。
    • インターセプタ関数
    • 適用するコンポーネントを示すcontainer.Matcher
      • コンポーネント名をcontainer.Matcherで評価し、trueとなったものにインターセプタが適用されます。
      • container.any()ですべてのコンポーネントにマッチするcontainer.Matcherが作成できます。
    • 適用するメソッドを示すcontainer.Matcher
      • メソッド名をcontainer.Matcherで評価し、trueとなったものにインターセプタが適用されます。
var stdout = document.getElementById( "stdout" );

// クラス
function Kitten( name, age ) {
    this.name = name;
    this.age = age;
}
Kitten.prototype = {
   getName: function () { return this.name; },
   getAge:  function () { return this.age; }
};

// コンテナ
var c = new container.Container( function( binder ) {

  binder.bind( "mii"  ).to( Kitten ).inject( { "name": "mii",  "age":1 });
  binder.bind( "tora" ).to( Kitten ).inject( { "name": "tora", "age":2 });

  // グローバルインターセプターの設定
  binder.bindInterceptor( function ( mi ) { // インターセプタ関数
      return mi.proceed() + "_global"; // 結果の末尾に"_global"を付けて返す。
    },
    container.any(),  // 適用するコンポーネントを示すcontainer.Matcher // この場合すべてのコンポーネントが対象
    container.any()); // 適用するメソッドを示すcontainer.Matcher // この場合すべてのメソッドが対象

});

var mii = c.get( "mii" );
stdout.innerHTML += mii.getName() + " : " + mii.getAge() + "<br/>"; // mii_global : 1_global
var tora = c.get( "tora" );
stdout.innerHTML += tora.getName() + " : " + tora.getAge() + "<br/>";  // tora_global : 2_global

実行結果です。

コンポーネントに個別に設定するインターセプタとの併用

コンポーネントに個別に設定するインターセプタとの重ねがけも可能です。この場合、以下の順でメソッドが実行されます。

  1. グローバルインターセプタ
  2. コンポーネント個別のインターセプタ
  3. 本来のメソッド
var c = new container.Container( function( binder ) {

  // コンポーネント個別のインターセプタと重ねがけも可能。
  binder.bind( "tora" ).to( Kitten ).inject( { "name": "tora", "age":2 });
  binder.bind( "mii"  ).to( Kitten ).inject( { "name": "mii",  "age":1 })
  .intercept( function ( mi ) { // インターセプタを設定
    return mi.proceed() + "_i"; // 結果の末尾に"_i"を付けて返す。
  }, container.any());

  // グローバルインターセプターの設定
  binder.bindInterceptor( function ( mi ) {
      return mi.proceed() + "_global";
  }, new container.Matcher(/mii/), new container.Matcher(/getAge/));

});

var mii = c.get( "mii" );
stdout.innerHTML += mii.getName() + ":" + mii.getAge() + "<br/>"; // mii_i : 1_i_global
var tora = c.get( "tora" );
stdout.innerHTML += tora.getName() + ":" + tora.getAge() + "<br/>";  // tora_ : 2

実行結果です。