ObjectBuilderでDIコンテナ

ObjectBuilderは所謂DI実装を提供するクラス群である。がSpringに代表されるJavaのDIコンテナのように設定ファイルにより制御する機能まではついていない。自分で実装する必要がある。SpringでいうXmlBeanFactory,ApplicationContext的なものは独自に定義してやる必要がある。
ただ、ObjectBuilderのテストケースにサンプル実装が提供されているのでそちらを参照すればよい。BuilderConfigTestクラスだったかと思う。
やらなければならないことは

  • xmlスキーマの定義
    • SpringやらSeaserを真似る感じで
  • xmlの定義上を基にObjectBuilderのPolicyListにXXXPolicyをセットする
    • サンプル実装を見ながらやれば、特に問題なし
  • SeaserでいうS2Container,S2ContainerFactoryなどを作って、裏で上記の処理を行う。

これでとりあえずは動く。とりあえずは動くレベル。
ユーザコードのイメージは

/**
 * Builderクラスのインスタンス化
 * XMLファイルのロード
 * ロードしたXmlReaderをデシリアライズしてXMLスキーマオブジェクトにマッピング 
 * XMLスキーマオブジェクトを基にXXXPolicyクラスをBuilderに追加
 */
Container container = ContainerFactory.Create();
/**
 * BuilderクラスのBuildUpメソッドの呼び出し
 */
MyBean bean = container.GetComponent("MyBean");

何かSeaserの人に怒られそうなクラス名だけど、まぁーいっか。

ObjectBuilderの構造に関して簡単にメモすると

  • 対象となるインスタンスを生成したり、オブジェクトをインジェクトしたりするのはStrategyクラス
  • どのクラスにどんなオブジェクトをインジェクトするのか、あるいはどのようにインスタンス化するのかなどの情報を保持するのがPolicyクラス
  • StrategyクラスはBuilder生成時に全て(9種ぐらい)インスタンス化され、Builder.BuildeUp()メソッドが呼び出された際にChainパターンにより、順に実行される。