AOContainer

ソースコード / ライセンス / ドキュメント / ASDoc

AOContainer

AOContainerは「Dependency Injection」(DI)を行う軽量コンテナです。 

DIとは、インターフェースと実装を分離して、オブジェクトを外部から生成し設定する仕組みで、代表的なDIコンテナには「Seasar(S2Container)」「Spring Framework」「PicoContainer?」などがあります。AOContainerは、これらのコンテナを参考に開発されました。

最新情報

ダウンロード

導入方法

Flex Builder 2 の場合

  1. Flex Builder上で、AOContainerを使用したいプロジェクトを開くか、作成します。
  2. ASReflectを、記載されている導入方法に従って導入します。
  3. プロジェクトのプロパティを表示し、「ActionScript? ビルドパス」内の「ライブラリパス」タブを開きます。
  4. 「SWCの追加」をクリックし、表示されたダイアログ内で、ダウンロードした「aocontainer-xxx.swc」(xxxはバージョン)を指定して追加します。
  5. 「OK」を押して設定を保存すれば完了です。これでAOContainer(org.libspark.aocontainerパッケージ)が使えるようになります。

必要な環境

ファーストステップ

ファーストステップでは、挨拶と、挨拶を表示するクラスをDIによって組み立てる手順を紹介します。(このファーストステップは「Seasar2 クイックスタート」を参考に作られました。)

はじめに、挨拶のためのインターフェイスを作ります。

package
{
    public interface Hello
    {
        function sayHello():String;
    }
}

挨拶インターフェイスの実装を作ります。

package
{
    public class HelloJapanese implements Hello
    {
        public function sayHello():String
        {
            return 'こんにちは!';
        }
    }
}

挨拶を利用して表示するためのインターフェイスを作ります。

package
{
    public interface HelloPrinter
    {
        function print():void;
    }
}

挨拶を利用して表示するためのインターフェイスの実装を作ります。ここで、HelloJapanese?クラスではなく、Helloインターフェイスを利用するのがポイントです。

package
{
    public class HelloPrinterImpl implements HelloPrinter
    {
        private var _hello:Hello;
        
        public function set hello(value:Hello):void
        {
            _hello = value;
        }
        
        public function print():void
        {
            trace(_hello.sayHello());
        }
    }
}

ドキュメントクラスに、これらのオブジェクトを組み立てる設定を書き、AOContainerFactoryを利用してAOContainerのインスタンスを作りますます。

package
{
    import org.libspark.aocontainer.AOContainer;
    import org.libspark.aocontainer.AOContainerFactory;
    import flash.display.Sprite;
    
    public class DocumentRoot extends Sprite
    {
        public function DocumentRoot()
        {
            // 予め、使うクラスを宣言しておかないと
            // クラスがリンクされない場合があるので注意してください
            HelloJapanese; HelloPrinterImpl;
            
            // 設定
            var config:XML = 
             <objects>
                 <object name='hello' class='HelloJapanese'/>
                 <object name='helloPrinter' class='HelloPrinterImpl'>
                     <property name='hello'>hello</property>
                 </object>
             </objects>;
            
            // ファクトリに設定を渡してコンテナを生成
            var container:AOContainer = AOContainerFactory.create(config);
        }
    }
}

設定ですが、

<object name='hello' class='HelloJapanese'/>

var hello:Hello = new HelloJapanese();

というコードに相当し、

<object name='helloPrinter' class='HelloPrinterImpl'>
    <property name='hello'>hello</property>
</object>

var helloPrinter:HelloPrinter = new HelloPrinterImpl();
helloPrinter.hello = hello;

というコードに相当します。

それでは実際に、コンテナから組み立てられたオブジェクトを取得して実行してみます。

package
{
    import org.libspark.aocontainer.AOContainer;
    import org.libspark.aocontainer.AOContainerFactory;
    import flash.display.Sprite;
    
    public class DocumentRoot extends Sprite
    {
        public function DocumentRoot()
        {
            // ..先程のコードは省略..
            
            var helloPrinter:HelloPrinter = HelloPrinter(container.getObject('helloPrinter'));
            helloPrinter.print();
        }
    }
}

うまくいけば次の出力を得ることが出来ます。

こんにちは!

更に詳しい使い方はドキュメントをご覧下さい。