グローバルインターセプター
JavaScriptで動くDIコンテナの解説その3。
グローバルインターセプターはすべてのコンポーネントに適用されるインターセプターです。複数のコンポーネントに一括してインターセプタを適用したい場合に使います。
- binder.bindInterceptor()でコンテナに登録します。引数で以下を指定します。
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
コンポーネントに個別に設定するインターセプタとの併用
コンポーネントに個別に設定するインターセプタとの重ねがけも可能です。この場合、以下の順でメソッドが実行されます。
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