インスタンス遅延生成の副作用

少し前のエントリに対して、すぎもとさんから言及頂いた。

インスタンスを必要になってから生成するsingletonなモードを新しく追加すれば良いのですが、diconファイルのDTDに変更が必要になってしまいます。

そこで手っ取り早く回避する方法ですが、S2コンテナを初期化しなければ良いです。コンポーネント毎に指定はできませんが、これならば現状で対処できます。

SingletonS2ContainerFactoryを使用する場合は、初期化しないとS2コンテナのインスタンスが生成されないので以下のようにします。
singletonコンポーネントのインスタンス遅延生成 - sugimotokazuyaの日記

基本的にはこの方法でいけるのだが、一つ微妙な問題がある。
全てのコンポーネントの登録(生成ではない)がコンテナの初期化前に完了しているのであれば、この方法で全然問題ないのだが、私の記憶が正しければ、本家Seasar2(2.4)で既に実装されているコンポーネントの自動登録メカニズム、具体的には、〜AutoRegister系のクラスは、コンテナのInitメソッドが実行されることで初めてコンポーネントの登録を開始する。従って、コンテナの初期化をしないと登録されておらず、使えないコンポーネントが出てきてしまう。私がわざわざ"EagerInstantiation(早期生成)"、と"LazyInstantiation(遅延生成)"のことを書いたのもこういう理由からだ。
ただし、これは現状の本家Seasar2(2.4)の作りの問題(どちらかというとサーバアプリケーション寄りの実装)であり、今後は実装が変わるかもしれないのと、そもそもS2Container.NETではまだAutoRegister系を実装していないので現状は問題にならないだろう。あくまで、今後の課題ということで。
個人的には、初期化をする/しないでインスタンスの早期生成をコントロールできるというのは良い機構だと思うので、本家のAutoRegister系のクラスはコンテナの初期化処理(Init)に依存するべきではないと考えている。