[seasar-dotnet:1306] Quillへの要望

橋本 昇 [E-MAIL ADDRESS DELETED]
2009年 5月 16日 (土) 23:20:20 JST


皆さんこんにちは、橋本と申します。

JIRAに上げていただいた下記の要望について改めて説明させていただきます。

CONTAINERNET-123:Quillの拡張性の向上(Settingクラス導入)
CONTAINERNET-124:Java版のS2にあるInitMethodアノテーションのサポート
CONTAINERNET-125:QuillInjectorの処理をQuillContainerに

現在、私はプロジェクトでS2ContainerかQuillかどちらを採用するべきか迷っています。
元々Java版のSeasarの利用経験はあったのですが、Quillは今回初めて触ることになりました。
S2と比べるとQuillは荒削りではありますが非常に魅力も感じました。
今後はQuillを中心にしていく方針のようですので、Quillに気持ちは傾いています。

ただ、S2とQuillを天秤にかけた結果、Quillにあったらよいのになと思った点がありましたので、コミュニティへの還元という意味で意見を上げさせていただきました。

今回の要望はどれもS2であれば実現できている物です。
※あくまでも天秤の感想なので・・・
今後、QuillがポストS2として進むのであれば、検討していただけるとありがたいです。
※私もQuillを選択しやすくなります
しかし、完成したソリューションという位置づけであれば必要ない事かもしれません。
※拡張を意図したフレームワークとしては既にS2があるのですから・・・

そういう意味の要望であるという事をご理解ください。

もし採用されるのであれば、個人的には要望2、要望1、要望3の順番が嬉しいです。


要望1:Quillの拡張性の向上(Settingクラス導入)

Quill全体で標準の設定方法を準備しては如何でしょうか?
TransactionやDaoが設定に困ってSettingクラスが作成されたように、ユーザ作成のコンポーネントも設定で当然困るわけです。
ここで言っているコンポーネントとは、再利用可能そうな、ちょっと複雑なものをイメージしてください。

Settingクラスでやりたいことは2つ
・対象のクラスに対するAspectの指定
・依存関係のあるクラスの登録や初期設定

例えば下記のイメージは如何でしょうか?
※XXXは適当な名前を想像してください
1.属性はAbstractXXXAttributeの派生型として作成する
⇒TransactionAttributeやS2DaoAttributeもこの属性から派生させる
⇒AbstractXXXAtributeにはSettingTypeというプロパティがあり、Quillはこのプロパティの返すクラスをSettingクラスとして利用する。
⇒属性の基底クラスが決められているので、Quill的に判別できるはず

2.SettingクラスはIXXXSettingインタフェースをインプリメントする
⇒インタフェースにはSetup,IsNeedSetup,GetMethodIntercepterの3つのメソッドがある
⇒Setupの引数か何かでQuillから属性を渡してもらえる
 ⇒属性のプロパティの値をSettingクラスで利用できる
⇒依存コンポーネントの登録/初期化はSettingクラスの中でコンテナと勝手にやってもらう
 ⇒あまり深く考えていません (^-^;;
⇒QuillセクションにSettingクラスが利用できる専用のセクションがあると嬉しい
 ⇒単純なKey,Valueの形でよいです


要望2:Java版のS2にあるInitMethodアノテーションのサポート

他のコンポーネントが必要ないコンポーネントであれば、初期処理はコンストラクタで行えばよいでしょう。しかし、他のコンポーネントのインジェクションを期待している場合は初期処理のタイミングに困ります。

例えばFormに対してQuillInjector.Injectを行ったとします。
ここでコンポーネントAがFormにインジェクトされたとします。
コンポーネントAはコンポーネントBに依存しているため、コンポーネントBのインジェクションを期待していたとします。
コンポーネントAのコンストラクタの時点ではコンポーネントBは、まだインジェクトされていないため、コンポーネントAは初期処理を行えません。
ただし、FormがコンポーネントAを利用する前にはインジェクションは完了しているはずです。
コンポーネントAのメソッドが1つであれば問題ないですが、メソッドが数多くある場合、全てのメソッドに「もし初期化が行われてなかったら?」というコードを書くのは、あまり嬉しくありません。

そこで、InitMethodアノテーションです。
コンポーネントに対するインジェクションが完了した時点でInitMethod属性がつけられているメソッドをQuill側から呼び出して欲しいのです。
登録するメソッドには引数なし、戻り値なしという制限があっても問題ありません。
クラスの中で1つで無ければならないか?は微妙ですが、Quill側が呼び出す順番に困るので、1つのみという制限があっても問題ないです。


要望1、2は一言でいうと標準的な環境構築方法が欲しいという事に尽きます。
手段は要望に書いた内容と違っていても構いません。

S2にはdiconがありますがQuillにはありません。
恐らく今後も付けませんよね?
是非、検討して欲しいです。(^-^)


要望3:QuillInjectorの処理をQuillContainerに

久保さんが「リファクタをするだけで実現できないか?」とコメントしていますが・・・
はい、それだけです。(^-^;;

MS系のプログラムはFormなどコンテナ管理外、かつ、Aspectを必要としないクラスが基点となる場合が多いため、最初の1歩はQuillInjector.Injectであることが普通だと思います。
しかし、直接コンポーネントをQuillContainerから取得するケースもあると思います。

QuillContainerでやって欲しい事
・Implementation属性を利用した実クラスの判定
・InjectionMap相当の機能

また、ついでとして下記の方法もあったら良いと思います。
・(インスタンス化+Aspect)+インジェクションを1発で出来るメソッド
 ⇒DIコンテナで管理しながら、わざとインジェクションしない流れはレアだと思う
・QuillInjectorが保持しているContainer実装の差し替え
 ⇒カスタマイズへの布石


非常に長文になりましたが、Quillがより良くなるためにお役に立てれば嬉しいです。



seasar-dotnet メーリングリストの案内