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(){}, [ /.*/, /.*/ ], [/.*/]] ] }