ひがやすを技術ブログ

電通国際情報サービスのプログラマ

プレゼンテーションフレームワークとの連携

IoCコンテナとプレゼンテーションフレームワークとの連携が
難しくなる最大の原因は、IoCコンテナは、コンポーネントの作成を
コンテナがおこなうが、プレゼンテーションフレームワーク
自分が必要なクラスは自分たちで作成するので、
その部分がかみ合わないせいだと思います。
その部分を蜜に結合させようとすると、プレゼンテーションフレームワーク
かなり手を入れることになり望ましくありません。
そこで、考えてみました。
インスタンスの作成は、プレゼンテーションフレームワークにまかせ、
IoCコンテナは、Dependency Injectionに専念すればよいと。
具体的に、S2Containerに次のメソッドの追加を考えています。
injectDependency(Object component)
injectDependency(Object component, Class componentClass)
injectDependency(Object component, String componentName)
例えば、Tapestryなら、ページ名と同じ名前で、コンポーネントを登録して
おき、あるタイミングでS2Container.injectDependency()を呼び出すのです。
ゴールデンウィーク中にTapestryのソースを読んで、適切な方法を考えたいと
思います。連携方法もS2Containerに限定することなく、
他のIoCコンテナとも連携できるようにインターフェースとして
切り出す必要があると思ってます。
Tapestryのチームとも連携取る必要がありますね。

連携

Injection(=注射)、Dependency(=依存)ということで、インスタンスを登録して、後に取得するときにプロパティ設定をやるメソッドを用意する感じでしょうか。S2Containerをオブジェクトプールとして使うように理解しました。
// 仮にinjectDependency()を持つインターフェイス: IComponentContainer
IComponentContainer container = getComponentContainer();
// ページ生成〜登録
IPage page = loadPage(pageName, ...);
container.injectDependency(page, pageName);

上記を最初(ページを作成した直後)にやる感じです。
property,initMethodタグだけをPageに適用するつもりでいます。
一度、injectDependencyしたら後は、コンテナの手を離れて、
Tapestryにまかせると。
ページをプーリングするかどうかもTapestryまかせ。


interface IComponentContainerHolder {
public IComponentContainer getComponentContainer();
}

interface IComponentContainer {
public void injectDependency(Object component, String pageName);
}
を適切なクラスが実装するイメージ。