DIコンテナ作成計画
JavaScriptで使えるDIコンテナはないかなとGoogleで10分だけ探したけど見つからなかったので、作ることにしました!(予定)
何に使うの?
MVCでUIを作ると、各レイヤー間の依存関係が何気に複雑になりがちです。
- 要素のイベントハンドラとコントローラの関連付けとか(View-Controllerの関連付け)
- モデルの変更を捕捉してUIを更新とか(View-Modelの関連付け)
このあたりを一手にやってくれるコンテナがあったら、使えるかなと思うわけです。
コンセプト
超軽量。
計画
- 基本線、Guice風で。
- 型がないので、名前ベースでバインディング。
- プロパティインジェクションのみサポート。
- AOPも使えるようにする。
- アノテーションを使って、コンポーネントのデフォルト設定を行えるようにしたい。
// コンテナを作成 // 引数でコンポーネントの定義を記述する関数を渡す。 var c = new container.Container( function( binder ) { // "name" に sample.Kitten クラスを関連付ける。 binder.bind("name").to( sample.Kitten ) ; binder.bind("name").toProvider( function( container ){ return obj; } ); binder.bind("name").toInstance( obj ); binder.bind("name").toFunction( "name", "functionName" ); // すべての設定を行ったもの。 binder.bind( "name" ).to( sample.Kitten ).inject( { "field1": "name", "field2": "name" }).initialize( function( obj, container ){ }).destroy( function( obj, container ){ }).scope( container.Scope.Singleton ).intercept( function(){}, /.*/, /.*/ ) ; // すべてのコンポーネントに適用するインターセプタ binder.bindInterceptor( function(){}, /.*/, /.*/ ); } ); // コンテナからコンポーネントを取得する。 var kitten = container.get( "kitten" ); //デフォルトの設定はアノテーションでもできる。 function Kitten () {} Kitten.prototype.meta = { "@container.inject": { "field":"service" }, "@container.initialize":function( obj, container ){}, "@container.destroy": function( obj, container ){}, "@container.scope": container.Scope.Singleton, "@container.intercept": [ [ function(){}, [ /.*/, /.*/ ], [/.*/]] [ function(){}, [ /.*/, /.*/ ], [/.*/]] ] }
System#identityHashCode(Object)
System#identityHashCode(Object)で、オブジェクトの「デフォルトのハッシュコード(Object#hashCode()と同じ値)」を返します。
- クラスがhashCode()をオーバーライドしていてもオーバーライド前のハッシュコードを取得できます。
- 返される値は、通常、オブジェクトの内部アドレス値を整数に変換した値になります。
- 注意:一意とは限りません。オブジェクトのアドレス空間がintより多いVMの場合、同じ値を返すオブジェクトが存在する可能性があります。
String a = new String("a"); String b = new String("a"); System.out.println( "equals :" + a.equals(b) ); // -> true // StringではhashCode()はオーバーライドされているため同じ値を返す。 System.out.println( "hashCode a :" + a.hashCode() ); System.out.println( "hashCode b :" + b.hashCode() ); // a,bはそれぞれ別のオブジェクトなので、別の値を返す。 System.out.println( "id a :" + System.identityHashCode(a) ); System.out.println( "id b :" + System.identityHashCode(b) );
実行結果です。
equals :true hashCode a :97 hashCode b :97 id a :827574 id b :17510567